Как конвертировать currentTimeMillis в дату в Java?
у меня есть миллисекунды в определенном файле журнала, сгенерированном на сервере, я также знаю локаль, из которой был сгенерирован файл журнала, моя проблема заключается в преобразовании миллисекунд в дату в указанном формате.
Обработка этого журнала происходит на сервере, расположенном в другом часовом поясе. При преобразовании в" 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
10 ответов:
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);
tl; dr
Instant.ofEpochMilli( 1_322_018_752_992L ) // Parse count of milliseconds-since-start-of-1970-UTC into an `Instant`. .atZone( ZoneId.of( "Africa/Tunis" ) ) // Assign a time zone to the `Instant` to produce a `ZonedDateTime` object.подробности
другие ответы используют устаревшие или неправильные классы.
избегайте старых классов даты и времени, таких как java.утиль.Дата./Календарь. Они оказались плохо спроектированными, запутанными и хлопотными.
java.время
The java.время фреймворк встроен в Java 8 и более поздние версии. Большая часть функциональности backported to Java 6 & 7 и далее адаптирован к Android. Сделано некоторыми из тех же людей, которые сделали Joda Времени.
An
Instantмомент на временной шкале в UTC с разрешением наносекунд. Его эпохи это первый момент 1970 года в UTC.предполагая, что входные данные-это количество миллисекунд с 1970-01-01T00:00:00Z (не понятно в вопросе), то мы можем легко создавать
Instant.Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L );мгновенный.toString (): 2011-11-23T03:25: 52.992 Z
The
Zв этом стандарте ISO 8601 форматированная строка-это сокращение отZuluи означает UTC.применить часовой пояс с помощью правильное название часового пояса, чтобы получить
ZonedDateTime.ZoneId zoneId = ZoneId.of( "Asia/Kolkata" ) ; ZonedDateTime zdt = instant.atZone( zoneId );посмотреть этот code run live at IdeOne.com.
Asia/Kolkataвремя зона ?я предполагаю, что у вас был часовой пояс Индии, влияющий на ваш код. Мы видим здесь, что настройка в
Asia/Kolkataчасовой пояс отображает то же время суток, как вы сообщаете,08:55что на пять с половиной часов опережает наше значение UTC03:25.2011-11-23T08:55:52.992+05:30[Азия/Калькутта]
зоны по умолчанию
вы можете применить текущий часовой пояс виртуальной машины. Остерегаться что значение по умолчанию может измениться в любой момент во время работы. Любой код в любом потоке любого приложения в JVM может изменить текущее значение по умолчанию. Если это важно, попросите пользователя указать желаемый / ожидаемый часовой пояс.
ZoneId zoneId = ZoneId.systemDefault(); ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
о java.время
The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие дата и время занятия как
java.util.Date,Calendar,&SimpleDateFormat.The Joda-Time, теперь режим обслуживания, советует миграция в java.время классы.
дополнительные сведения см. В разделе элемент Учебник Oracle. Поиск переполнения стека для многих примеров и объяснений. Спецификация является JSR 310.
С - драйвера соответствии с JDBC 4.2 или позже вы можете обменять java.время объекты непосредственно с вашей базой данных. Нет необходимости в строках или java.язык SQL.* учебные занятия.
где получить java.время занятий?
- Java SE 8, Java SE 9, и позже
- встроенный.
- часть стандартного Java API с комплектной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- большая часть java.функциональность время портированы с Java 6 и 7 в ThreeTen-Backport.
- Android
- более поздние версии Android bundle реализации java.время занятий.
- для более ранних Android, ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). Смотрите как использовать ThreeTenABP....
The ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к java.время. Вы можете найти некоторые полезные классы, такие как
Interval,YearWeek,YearQuarterи больше.
Если значение millis-это число миллисов с 1 января 1970 года по Гринвичу, как это стандартно для JVM, то это не зависит от часового пояса. Если вы хотите отформатировать его с определенным часовым поясом, вы можете просто преобразовать его в объект gregoriancalendar и установить часовой пояс. После этого есть множество способов его форматирования.
самый простой способ сделать это-использовать Joda DateTime class и укажите как метку времени в миллисекундах, так и нужный вам часовой пояс.
Я настоятельно рекомендую избегать встроенных классов даты и календаря Java; они ужасны.
Мое Решение
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 (часовой пояс), который наследуется от класса 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
ниже мое решение, чтобы получить дату от милисекунд до формата даты. Вы должны использовать Библиотека Джода чтобы запустить этот код.
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)); } }
Comments