Как преобразовать 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 

 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); 

Вы можете использовать class java.util.Date а затем использовать SimpleDateFormat для форматирования Date .

 Date date=new Date(millis); 

ТЛ; др

 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. 

Детали

Другие ответы используют устаревшие или неправильные classы.

Избегайте старых classов времени, таких как java.util.Date/.Calendar. Они оказались плохо спроектированными, запутанными и неприятными.

java.time

Рамка java.time встроена в Java 8 и более поздние версии . Большая часть функциональных возможностей предоставляется обратно на Java 6 и 7 и далее адаптирована к Android . Сделано теми же людьми, что и Joda-Time .

Instant – это момент на временной шкале в UTC с разрешением наносекунды . Его эпоха – первый момент 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 = instant.atZone( zoneId ); 

Посмотрите, как этот код работает в режиме реального времени на IdeOne.com .

Asia/Kolkata часовой пояс?

Я предполагаю, что у вас был часовой пояс в Индии, влияющий на ваш код. Мы видим здесь, что приспосабливание к Asia/Kolkata поясу Asia/Kolkata дает такое же время суток, как вы сообщаете, 08:55 что на пять с половиной часов превышает наше значение UTC 03:25 .

2011-11-23T08: 55: 52,992 + 05: 30 [Азия / Калькутта]

По умолчанию

Вы можете применить текущий часовой пояс по умолчанию для JVM. Помните, что значение по умолчанию может измениться в любой момент во время выполнения . Любой код в любом streamе любого приложения в JVM может изменить текущий по умолчанию. Если это важно, попросите пользователя указать желаемый / ожидаемый часовой пояс.

 ZoneId zoneId = ZoneId.systemDefault(); ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); 

О java.time

Рамка java.time встроена в Java 8 и более поздние версии . Эти classы вытесняют неприятные старые устаревшие classы времени, такие как java.util.Date , Calendar и SimpleDateFormat .

Проект Joda-Time , теперь в режиме обслуживания , советует перейти на classы java.time .

Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle . И поиск Stack Overflow для многих примеров и объяснений. Спецификация – JSR 310 .

С JDBC-драйвером, совместимым с JDBC 4.2 или более поздней версией , вы можете обмениваться объектами java.time непосредственно с вашей базой данных. Нет необходимости в строках или java.sql. * Classes.

Где можно получить classы java.time?

  • Java SE 8 , Java SE 9 и более поздние версии
    • Встроенный.
    • Часть стандартного Java API с интегрированной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональных возможностей java.time включена обратно в Java 6 и 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализаций пакетов Android classов java.time.
    • Для более ранних Android проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). См. Раздел Как использовать ThreeTenABP ….

Проект ThreeTen-Extra расширяет java.time с дополнительными classами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные classы, такие как Interval , YearWeek , YearQuarter и другие .

Если значение миллиса – это количество миллиметров с 1 января 1970 г. по Гринвичу, как стандарт для JVM, то это не зависит от часового пояса. Если вы хотите отформатировать его с определенным часовым поясом, вы можете просто преобразовать его в объект GregorianCalendar и установить часовой пояс. После этого существует множество способов форматирования.

Самый простой способ сделать это – использовать class Joda DateTime и указать как временную метку в миллисекундах, так и дату DateTimeZone .

Я настоятельно рекомендую избегать встроенных classов Java Date и Calendar; они ужасны.

Мое решение

 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), который унаследован от classа 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)); } } 
  • Общие элементы в двух списках
  • Использование библиотеки Java с зарезервированными словами Scala
  • Как я могу форматировать номер строки, чтобы иметь запятые и круглые?
  • Воспроизведение видео Youtube с использованием JavaFX
  • Как использовать GWT EventBus
  • Объяснение Джеймса Гослинга о том, почему байт Java подписан
  • Есть ли преимущество использования Синхронизированного метода вместо Синхронизированного блока?
  • У java действительно есть указатели или нет?
  • Как импортировать class из пакета по умолчанию
  • Как предотвратить сбор объекта из мусора?
  • Как преобразовать List в int в Java?
  • Interesting Posts

    Как вызвать метод пользовательского интерфейса из другого streamа

    как использовать «war.context» в файле конфигурации Play Framework?

    Извлечение открытого / закрытого ключа из файла PKCS12 для последующего использования в SSH-PK-аутентификации

    Узел: войдите в файл вместо консоли

    Должен ли я использовать свойства или прямую ссылку при доступе к переменным экземпляра внутри?

    Сортировка списка из другого идентификатора списка

    KDE на CentOS крадет Alt-Shift из приложений?

    Как найти индекс элемента в массиве в Java?

    Многоgradleиентные формы

    AngularJS: список ng-repeat не обновляется, когда элемент модели сплайсируется из массива модели

    Почему Fetch API Отправляет первый запрос PUT в качестве ВАРИАНТОВ

    как использовать представления в первой структуре сущности кода

    Переконфигурирование беспроводных настроек точки доступа Wi-Fi через WPS?

    Windows 8.1 Черный экран и безопасный режим

    Async WebApi Thread.CurrentCulture

    Давайте будем гением компьютера.