Преобразование секунд эпохи в формат даты и времени в Java

У меня есть секунды с 1 января 1970 года по всемирному координированному времени (время эпохи).

1320105600

Мне нужно преобразовать эти секунды в дату и время в формате ниже.

Friday,November 4,2011 5:00,AM

Как я могу этого добиться?


person androiduser    schedule 24.11.2011    source источник
comment
Одна из идей - просмотреть javadocs, например java.util.Date.   -  person Ingo    schedule 25.11.2011


Ответы (4)


Если вы ограничены устаревшими API java.util.Date и java.util.Calendar, вам необходимо принять во внимание, что временные метки интерпретируются в миллисекундах, а не в секундах. Поэтому сначала нужно умножить его на 1000, чтобы получить отметку времени в миллисекундах.

long seconds = 1320105600;
long millis = seconds * 1000;

Таким образом, вы можете скормить его а.о. конструктор java.util.Date и, наконец, используйте SimpleDateFormat для преобразования java.util.Date в java.lang.String в желаемом шаблоне формата даты, при необходимости с предварительно определенным часовым поясом (в противном случае будет использоваться системный часовой пояс по умолчанию , что само по себе не является GMT / UTC, поэтому форматированное время может быть отключено).

Date date = new Date(millis);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE,MMMM d,yyyy h:mm,a", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String formattedDate = sdf.format(date);
System.out.println(formattedDate); // Tuesday,November 1,2011 12:00,AM

Если вы уже используете Java8, есть _ 9_, который позволяет вводить секунды эпохи напрямую без необходимости умножения на миллисекунды.

LocalDateTime dateTime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE,MMMM d,yyyy h:mm,a", Locale.ENGLISH);
String formattedDate = dateTime.format(formatter);
System.out.println(formattedDate); // Tuesday,November 1,2011 12:00,AM
person BalusC    schedule 24.11.2011
comment
Пожалуйста, подробно опишите, какой результат вы получили и какого результата ожидали. Я не могу напрямую обратиться к вам лично, чтобы увидеть проблему собственными глазами. По крайней мере, я могу сказать, что опубликованный код у меня работает нормально и что я получил результат, показанный в комментарии к последней строке. - person BalusC; 25.11.2011
comment
На самом деле я сделал ошибку, чтобы четко опубликовать вопрос. Здесь я работаю с таймингами Чикаго в США. И мои секунды - 1320105600. Правильный результат для этого вопроса - вторник, 0 ноября 2011 г., 7:00 утра, но я получаю понедельник, 31 октября, 2011 7:00 PM, используя указанный выше код. - person androiduser; 25.11.2011
comment
Я понимаю, что есть разница в часовом поясе, но 12 часов? - person BalusC; 25.11.2011
comment
Я еще раз проверил это по времени Чикаго (CST, GMT-6). Ваш сравнительный материал, вероятно, неверен или неверно истолкован. Возможно, маркер AM / PM или 24-часовая информация о времени были неправильно интерпретированы. Точная разница в 12 часов - тоже слишком большое совпадение. Обратите внимание, что ответ, который вы получили на свой другой вопрос, также подтверждает это. Попробуйте использовать CST в качестве часового пояса и calendar.set(2011, Calendar.OCTOBER, 31, 19, 0);. Вы получите ровно 1320105600. - person BalusC; 25.11.2011
comment
Похоже, вы или ваш коллега все еще не понимали влияние часового пояса: stackoverflow.com/questions/8273200/ Это также подтверждает, что ваш сравнительный материал неверен. Я отредактирую ответ, включив часовой пояс UTC. - person BalusC; 25.11.2011

long yourSeconds = 1320105600L;
Date date = new Date(yourSeconds * 1000);

См. Этот javadoc для получения дополнительной информации. Конструктору нужны миллисекунды.

Чтобы отобразить эту дату в соответствующем формате, вы должны проверить DateFormat

Вот пример:

DateFormat df = new SimpleDateFormat("dd MMM yyyy hh:mm:ss zzz");
System.out.println(df.format(date));
person lukastymo    schedule 24.11.2011

java.time

Ответ BalusC хорош тем, что указывает на использование java.time. Но в этом ответе используется LocalDateTime, где _ 2_ более уместно. LocalDateTime не момент на временной шкале, поскольку он намеренно не имеет понятия о смещении от-UTC или часовой пояс.

java.time

Создана структура java.time в Java 8 и новее. Эти классы вытесняют старые неприятные классы даты и времени, такие как java.util.Date, .Calendar, & java.text.SimpleDateFormat. Команда Joda-Time также советует перейти на java.time.

Чтобы узнать больше, см. Учебник Oracle. И поищите в Stack Overflow множество примеров и объяснений.

Большая часть функций java.time перенесена на Java 6 и 7 в ThreeTen-Backport и более поздних версиях. адаптирован для Android в ThreeTenABP.

Instant

Момент на временной шкале в UTC с разрешением до наносекунды представлены _ 8_ класс.

Instant instant = Instant.ofEpochSecond ( 1_320_105_600L );

Выгрузить в консоль. Введенное значение - первый момент 1 ноября 2011 г. в UTC. Z на конце, сокращение от «Zulu», означает всемирное координированное время.

System.out.println ( "instant: " + instant );

мгновенно: 2011-11-01T00: 00: 00Z

ZonedDateTime

В своих комментариях вы упоминаете, что хотите видеть эту дату и время через призму часового пояса America/Chicago. Используйте правильное название часового пояса. Примените часовой пояс ZoneId, чтобы получить объект ZonedDateTime. Мы видим, что в этот день Чикаго на пять часов отстает от UTC.

ZoneId zoneId = ZoneId.of ( "America/Chicago" );
ZonedDateTime zdt = instant.atZone ( zoneId );

zdt: 2011-10-31T19: 00-05: 00 [Америка / Чикаго]

Струны

Показанные выше строки имеют стандартный формат ISO 8601. Для создания строк в других форматах используйте DateTimeFormatter < / a> класс. Вы можете указать свой собственный шаблон. Но обычно лучше позволить java.time автоматически локализоваться для человеческого языка и культурных норм, закодированных в _ 18_.

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL );
formatter = formatter.withLocale ( Locale.US );
String output = zdt.format ( formatter );

31 октября 2011 г. 19:00:00 CDT

Чтобы указать свой собственный формат, поищите в Stack Overflow множество примеров и другие обсуждения.

person Basil Bourque    schedule 24.07.2016

Уловка состоит в том, чтобы использовать java.util.Date и java.text.DateFormat, чтобы получить нужный формат. Вы можете узнать, как это сделать, в руководствах в Интернете.

person Malcolm    schedule 24.11.2011