Разница между yyyy-MM-dd'T'HH: мм: ss.SSSZZ и yyyy-MM-dd'T'HH: мм: ss.SSSXXX? - PullRequest
0 голосов
/ 14 октября 2019

Интересно, представляют ли они различные форматы или по сути одинаковы (просто новые или старые презентации).

1 Ответ

2 голосов
/ 14 октября 2019

На основе DateTimeFormatter :

Смещение X и x: Форматирует смещение на основе количества букв шаблона.
-Однобуква выводит только час, например, «+01», если только минута не равна нулю; в этом случае также выводится минута, например, «+0130».
-Два буквы выводят часы и минуты бездвоеточие, такое как «+0130».
- три буквы выводят часы и минуты с двоеточием, например «+01: 30».
- четыре буквы выводят часы и минуты и необязательную секунду, бездвоеточие, например «+013015».
-Пять букв выводит час и минуту и ​​необязательную секунду, с двоеточием, например «+01: 30: 15».
-Шесть или более букв выдает исключение IllegalArgumentException,Буква шаблона «X» (верхний регистр) будет выводить «Z», когда выводимое смещение будет равно нулю, а буква шаблона «x» (нижний регистр) будет выводить «+00», «+0000» или «+00». : 00 '.

Смещение Z: Форматирует смещение на основе количества букв шаблона.
- Одна, две или три буквы выводят час и минуту без двоеточия, например, «+0130». Вывод будет равен «+0000», когда смещение равно нулю.
- Четыре буквы выводят полную форму локализованного смещения, эквивалентного четырем буквам Offset-O. Выводом будет соответствующий локализованный текст смещения, если смещение равно нулю.
- Пять букв выводят час, минуту, с необязательной секундой, если не ноль, с двоеточием. Он выводит 'Z', если смещение равно нулю.
- Шесть или более букв выбрасывает IllegalArgumentException.

Код:

public static void printDate(Temporal t, String format) {
    System.out.println(DateTimeFormatter.ofPattern(format).format(t));
}

public static void testJavaTime() {
    ZonedDateTime zdt = ZonedDateTime.now();
    printDate(zdt, "yyyy-MM-dd HH:mm:ss.SSSZ");       //2019-10-14 08:15:53.115+0200    
    printDate(zdt, "yyyy-MM-dd HH:mm:ss.SSSZZ");      //2019-10-14 08:15:53.115+0200    
    printDate(zdt, "yyyy-MM-dd HH:mm:ss.SSSZZZ");     //2019-10-14 08:15:53.115+0200    
    printDate(zdt, "yyyy-MM-dd HH:mm:ss.SSSZZZZ");    //2019-10-14 08:15:53.115GMT+02:00
    printDate(zdt, "yyyy-MM-dd HH:mm:ss.SSSZZZZZ");   //2019-10-14 08:15:53.115+02:00   
    printDate(zdt, "yyyy-MM-dd HH:mm:ss.SSSX");       //2019-10-14 08:15:53.115+02      
    printDate(zdt, "yyyy-MM-dd HH:mm:ss.SSSXX");      //2019-10-14 08:15:53.115+0200    
    printDate(zdt, "yyyy-MM-dd HH:mm:ss.SSSXXX");     //2019-10-14 08:15:53.115+02:00   
    printDate(zdt, "yyyy-MM-dd HH:mm:ss.SSSXXXX");    //2019-10-14 08:15:53.115+0200    
    printDate(zdt, "yyyy-MM-dd HH:mm:ss.SSSXXXXX");   //2019-10-14 08:15:53.115+02:00
}

На основе SimpleDateFormat, это простой вопрос возможного формата:

Z   Time zone   RFC 822 time zone   -0800
X   Time zone   ISO 8601 time zone  -08; -0800; -08:00

Независимо от суммы Z, он всегда будет использовать формат [-+]####
Но с X это отличается.

  • X: [-+]##
  • XX: [-+]####
  • XXX: [-+]##:##

Теперь давайте продемонстрируем это:

public static void printDate(Date d, String format){
    System.out.println(new SimpleDateFormat(format).format(d));
}

public static void testJavaDate() {
    Date d = new Date();
    printDate(d, "yyyy-MM-dd HH:mm:ss.SSSZ");    //2019-10-14 07:52:10.308+0200 
    printDate(d, "yyyy-MM-dd HH:mm:ss.SSSZZ");   //2019-10-14 07:52:10.308+0200 
    printDate(d, "yyyy-MM-dd HH:mm:ss.SSSZZZ");  //2019-10-14 07:52:10.308+0200 
    printDate(d, "yyyy-MM-dd HH:mm:ss.SSSX");    //2019-10-14 07:52:10.308+02   
    printDate(d, "yyyy-MM-dd HH:mm:ss.SSSXX");   //2019-10-14 07:52:10.308+0200 
    printDate(d, "yyyy-MM-dd HH:mm:ss.SSSXXX");  //2019-10-14 07:52:10.308+02:00   
}
...