Вот ответ 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));
Есть ли способ для старых javas без joda? – Karussell
Смотрите: http://stackoverflow.com/questions/13040143/generic-support-for-iso-8601-format-in-java-6 –
Я считаю, что формат имеет «HH», то есть yyyy-MM-dd'T «HH: MM: ss.SSSXXX; поскольку «hh» будет производить 00-12 и «HH» 00-23. Кроме того, из другого вопроса, связанного с SO. – Leo