В Java как я могу получить "2012-11-25T23: 50: 56.193 + 01: 00" с помощью SimpleDateFormat? Если я использую Z в формате, например
"yyyy-MM-dd'T'hh: mm: ss.SSSZ" - тогда он показывает
2013-03-06T11: 49: 05,490 + 0100
В Java как я могу получить "2012-11-25T23: 50: 56.193 + 01: 00" с помощью SimpleDateFormat? Если я использую Z в формате, например
"yyyy-MM-dd'T'hh: mm: ss.SSSZ" - тогда он показывает
2013-03-06T11: 49: 05,490 + 0100
Вы можете получить смещение временной зоны в формате +01:00
с помощью SimpleDateFormat в Java 7 (yyyy-MM-dd'T'HH:mm:ss.SSSXXX
) или с помощью Joda DateTimeFormat (yyyy-MM-dd'T'HH:mm:ss.SSSZZ
).
Вот ответ 2017 года. Если есть какой-либо способ (который есть), выбросите устаревшие классы как SimpleDateFormat
за борт и используйте современные и более удобные классы в java.time
. В частности, желаемый формат 2012-11-25T23:50:56.193+01:00
соответствует ISO-8601 и поэтому выходит из коробки с более новыми классами, просто используйте OffsetDateTime.toString()
:
OffsetDateTime time = OffsetDateTime.now();
System.out.println(time.toString());
Отпечатает что-то вроде
2017-05-10T16:14:20.407+02:00
Одна вещь, которую вы можете или не хотите знать, однако, она печатает столько групп из 3 десятичных знаков в секундах, сколько требуется для печати точности в объекте OffsetDateTime
. По-видимому, на моем компьютере "сейчас" поставляется с точностью миллисекунд (секунды с тремя десятичными знаками).
Если у вас есть старомодный объект Date
, например, вы получили его из вызова какого-либо унаследованного метода, я рекомендую, чтобы первое, что вы делаете, это преобразовать его в Instant
, который является одним из современных классов. Оттуда вы можете легко выполнить другие преобразования в зависимости от ваших требований:
Date now = new Date();
OffsetDateTime time = now.toInstant().atZone(ZoneId.systemDefault()).toOffsetDateTime();
System.out.println(time.toString());
Я действительно делаю больше конверсий, чем необходимо. atZone(ZoneId.systemDefault())
произвел a ZonedDateTime
, а его toString()
не всегда даст вам формат, который вы сказали; но его можно легко отформатировать:
ZonedDateTime time = now.toInstant().atZone(ZoneId.systemDefault());
System.out.println(time.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));