Конвертировать секунды эпох в формат даты и времени в Java - PullRequest
21 голосов
/ 25 ноября 2011

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

1320105600

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

Friday,November 4,2011 5:00,AM

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

Ответы [ 5 ]

31 голосов
/ 25 ноября 2011

Если вы ограничены устаревшими 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, есть LocalDateTime#ofEpochSecond(), который позволяет напрямую передавать значения эпох без необходимости умножения на миллисекунды.

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
12 голосов
/ 25 ноября 2011
long yourSeconds = 1320105600L;
Date d = new Date(yourSeconds * 1000);

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

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

Вот пример:

DateFormat df = new SimpleDateFormat("dd MMM yyyy hh:mm:ss zzz");
System.out.println(df.format(date));
6 голосов
/ 24 июля 2016

java.time

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

java.time

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

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

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

Instant

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

Instant instant = Instant.ofEpochSecond ( 1_320_105_600L );

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

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 [America / Chicago]

Строки

Вышеуказанные строки представлены в стандартном формате ISO 8601 .Для генерации строк в других форматах используйте класс DateTimeFormatter.Вы можете указать свой собственный шаблон.Но обычно лучше всего разрешить java.time автоматически локализоваться на человеческий язык и культурные нормы, закодированные в объекте Locale.

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

Понедельник, 31 октября 2011 г. 7: 00: 00 PM CDT

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

2 голосов
/ 25 ноября 2011
int seconds = 1320105600;
Date date = new Date(seconds * 1000);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE,MMMM d,yyyy h:mm,a");
System.out.println(sdf.format(date));
0 голосов
/ 25 ноября 2011

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

...