Подтвердить что ты не робот

Java SimpleDateFormat Смещение временной зоны с минутой, разделенной двоеточием

В 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

4b9b3361

Ответ 1

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

Ответ 2

Вот ответ 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));