2013-03-06 2 views

ответ

22

Вы можете получить смещение часового пояса отформатирован как +01:00 с SimpleDateFormat в Java 7 (yyyy-MM-dd'T'HH:mm:ss.SSSXXX), или с Joda «s DateTimeFormat (yyyy-MM-dd'T'HH:mm:ss.SSSZZ).

+2

Есть ли способ для старых javas без joda? – Karussell

+1

Смотрите: http://stackoverflow.com/questions/13040143/generic-support-for-iso-8601-format-in-java-6 –

+1

Я считаю, что формат имеет «HH», то есть yyyy-MM-dd'T «HH: MM: ss.SSSXXX; поскольку «hh» будет производить 00-12 и «HH» 00-23. Кроме того, из другого вопроса, связанного с SO. – Leo

1

Вот ответ 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()) произвел ZonedDateTime, а его toString() не всегда даст вам формат, который вы сказали; но его можно легко отформатировать:

ZonedDateTime time = now.toInstant().atZone(ZoneId.systemDefault()); 
    System.out.println(time.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); 
Смежные вопросы