Ответ 1
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);
int mYear = calendar.get(Calendar.YEAR);
int mMonth = calendar.get(Calendar.MONTH);
int mDay = calendar.get(Calendar.DAY_OF_MONTH);
У меня есть миллисекунды в определенном файле журнала, сгенерированном на сервере, я также знаю локаль, из которой был создан файл журнала, моя проблема заключается в том, чтобы преобразовать миллисекунды на сегодняшний день в указанном формате. Обработка этого журнала происходит на сервере, расположенном в другом часовом поясе. При преобразовании в программу "SimpleDateFormat" выполняется дата даты, так как такая форматированная дата не соответствует правильному времени сервера. Есть ли способ отрегулировать это элегантно?
long yourmilliseconds = 1322018752992l;
//1322018752992-Nov 22, 2011 9:25:52 PM
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS",Locale.US);
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(yourmilliseconds);
System.out.println("GregorianCalendar -"+sdf.format(calendar.getTime()));
DateTime jodaTime = new DateTime(yourmilliseconds,
DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss,SSS");
System.out.println("jodaTime "+parser1.print(jodaTime));
Вывод:
Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);
int mYear = calendar.get(Calendar.YEAR);
int mMonth = calendar.get(Calendar.MONTH);
int mDay = calendar.get(Calendar.DAY_OF_MONTH);
Вы можете использовать класс java.util.Date
, а затем использовать SimpleDateFormat
для форматирования Date
.
Date date=new Date(millis);
Если значение миллиса - это количество миллиметров с 1 января 1970 г. по Гринвичу, как стандарт для JVM, то это не зависит от часового пояса. Если вы хотите отформатировать его с определенным часовым поясом, вы можете просто преобразовать его в объект GregorianCalendar и установить часовой пояс. После этого существует множество способов отформатировать его.
Самый простой способ сделать это - использовать класс Joda DateTime и указать как метку времени в миллисекундах, так и дату DateTimeZone.
Я настоятельно рекомендую избегать встроенных классов Java Date и Calendar; они ужасны.
В других ответах используются устаревшие или неправильные классы.
Избегайте старых классов времени, таких как java.util.Date/.Calendar. Они оказались плохо спроектированными, запутанными и неприятными.
Структура java.time встроена в Java 8 и более поздних версий. Большая часть функциональных возможностей backported на Java 6 и 7 и далее адаптирована для Android. Сделано теми же людьми, что и Joda-Time.
An Instant
- это момент на временной шкале в UTC с разрешением наносекунды. Его epoch - первый момент 1970 года в UTC.
Предполагая, что ваши входные данные составляют миллисекунды с 1970-01-01T00: 00: 00Z (непонятно в вопросе), мы можем легко создать экземпляр Instant
.
Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L );
instant.toString(): 2011-11-23T03: 25: 52.992Z
Z
в этой стандартной ISO 8601 форматированная строка коротка для Zulu
и означает UTC.
Примените часовой пояс, используя имя часового пояса, чтобы получить ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "Asia/Kolkata" ) );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Смотрите этот запуск кода на IdeOne.com.
Asia/Kolkata
часовой пояс?Я предполагаю, что у вас был часовой пояс в Индии, влияющий на ваш код. Мы видим здесь, что при настройке в Asia/Kolkata
часовой пояс отображает то же время дня, что и вы, 08:55
, которое равно пяти и за полтора часа до нашего значения UTC 03:25
.
2011-11-23T08: 55: 52,992 + 05: 30 [Азия/Калькутта]
Вы можете применить текущий часовой пояс по умолчанию JVM. Помните, что значение по умолчанию может измениться в любой момент во время выполнения. Любой код в любом потоке любого приложения в JVM может изменить текущий по умолчанию. Если это важно, попросите пользователя указать желаемый/ожидаемый часовой пояс.
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Мое решение
public class CalendarUtils {
public static String dateFormat = "dd-MM-yyyy hh:mm";
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
public static String ConvertMilliSecondsToFormattedDate(String milliSeconds){
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(Long.parseLong(milliSeconds));
return simpleDateFormat.format(calendar.getTime());
}
}
Класс SimpleDateFormat имеет метод SetTimeZone (TimeZone), который унаследован от класса DateFormat. http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html
Самый простой способ:
private String millisToDate(long millis){
return DateFormat.getDateInstance(DateFormat.SHORT).format(millis);
//You can use DateFormat.LONG instead of SHORT
}
Я делаю это так:
static String formatDate(long dateInMillis) {
Date date = new Date(dateInMillis);
return DateFormat.getDateInstance().format(date);
}
Вы также можете использовать getDateInstance(int style)
со следующими параметрами:
DateFormat.SHORT
DateFormat.MEDIUM
DateFormat.LONG
DateFormat.FULL
DateFormat.DEFAULT
Ниже представлено мое решение для получения даты от формата miliseconds до даты. Вы должны использовать Joda Library, чтобы запустить этот код.
import java.util.GregorianCalendar;
import java.util.TimeZone;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class time {
public static void main(String args[]){
String str = "1431601084000";
long geTime= Long.parseLong(str);
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(geTime);
DateTime jodaTime = new DateTime(geTime,
DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd");
System.out.println("Get Time : "+parser1.print(jodaTime));
}
}