Анализ даты Java не работает для часового пояса ET, работая для IST - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь разобрать строку на сегодняшний день.Строка, имеющая формат даты как «dd-MMM-yyyy Z» и Строка, имеющая значение «12-DEC-2018 ET».Выдает ошибку java.text.ParseException: Непонятная дата: "12-DEC-2018 ET".

Тот же код работает для строки, имеющей значение "12-DEC-2018 IST".ниже приведен фрагмент кода:

public static void main(String[] args) throws ParseException {

    String dateInputIST ="12-DEC-2018 IST";
    String dateInputET ="12-DEC-2018 ET";

    SimpleDateFormat sdfmt1 = new SimpleDateFormat("dd-MMM-yyyy Z");
    SimpleDateFormat sdfmt2= new SimpleDateFormat("dd/MM/yyyy");

    Date dDate = sdfmt1.parse( dateInputIST );
    String strOutput = sdfmt2.format( dDate );

    System.out.println(strOutput);

    Date etDate = sdfmt1.parse(dateInputET);
    strOutput = sdfmt2.format(etDate);

    System.out.println(strOutput);

}

Может кто-нибудь, пожалуйста, помогите.Мне нужно было разобрать время в любом часовом поясе.Спасибо, Навин

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Псевдозоны

ET, EST и IST фактически не являются часовыми поясами.Эти 2-4-буквенные псевдозоны не стандартизированы и даже не уникальны!Например, IST может означать стандартное время Индии, стандартное время Ирландии, стандартное время Исландии и многое другое.

Имена зон реального времени принимают формат Continent/Region, например Africa/Tunis.

Дата и зона отдельно

Дата с часовым поясом не имеет реального значения.

Обрабатывать дату как объект LocalDate.

String input = "12-DEC-2018"
DayeTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" , Locale.US ) ;
LocalDate ld = LocalDate.parse( input , f ) ;

Обрабатывайте нужный часовой пояс отдельно, как ZoneId объект.

ZoneId zNewYork = ZoneId.of( "America/New_York" ) ; 

Для объединения определите первый момент дня.

ZonedDateTime zdtNewYork = ld.atStartOfDay( z ) ;

Создание текста, представляющего этот момент, в стандартном формате ISO 8601, расширенном для добавления названия часового пояса в квадратных скобках.

Чтобы увидеть тот же момент в UTC, извлеките Instant.

Instant instant = zdtNewYork.toInstant() ;

Настройка в другую зону.

ZonedDateTime zdtKolkata = instant.atZone( ZoneId.of( "Asia/Kolkata" ) ) ;

Чтобы сфокусироваться только на дате, получите LocalDate для дня того же момента, если смотреть через объектив настенного времени, используемого в Индии.

LocalDate ldKolkata = zdtKolkata.toLocalDate() ;

О java.time

Среда java.time встроена в Java 8и позже.Эти классы вытесняют старые классные устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии пакетов Android для реализации java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 03 октября 2018

java.time

    DateTimeFormatter dateZoneFormatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("dd-MMM-uuuu v")
            .toFormatter(Locale.ENGLISH);

    String dateInputIST ="12-DEC-2018 IST";
    String dateInputET ="12-DEC-2018 ET";

    TemporalAccessor parsed = dateZoneFormatter.parse(dateInputIST);
    System.out.println("Date: " + LocalDate.from(parsed) + " Time zone: " + ZoneId.from(parsed));

    parsed = dateZoneFormatter.parse(dateInputET);
    System.out.println("Date: " + LocalDate.from(parsed) + " Time zone: " + ZoneId.from(parsed));

На моем компьютере вывод этого фрагмента был следующим:

Date: 2018-12-12 Time zone: Atlantic/Reykjavik
Date: 2018-12-12 Time zone: America/New_York

Буква шаблона формата v предназначена для общее имя часового пояса , то есть имя, которое является одинаковым в течение всего года независимо от летнего времени (DST), например, восточное время или короткое ET.

Если вы хотите контролироватьДля интерпретации неоднозначных сокращений часовых поясов (которых их много), вы можете использовать двойную аргу appendGenericZoneText​(TextStyle, Set<ZoneId>), где второй аргумент содержит предпочтительные зоны.Еще лучше, если у вас есть способ полностью отказаться от аббревиатур часовых поясов, поскольку, как я уже говорил, они очень часто неоднозначны.

Я не уверен, какой смысл имеет дата с часовым поясом, хотя.

В качестве дополнительной точки всегда указывайте локаль для ваших форматеров, чтобы они также работали, если локаль по умолчанию изменяется или однажды ваша программа запускается в JVM с другой локалью по умолчанию.

Избегайте SimpleDateFormat и Date

Я не думаю, что SimpleDateFormat сможет проанализировать вашу строку.Это то же самое, так как этот класс уже давно устарел и известен тем, что доставляет неприятности, поэтому вы никогда не должны его использовать.

0 голосов
/ 02 октября 2018

Изменить

 String dateInputET ="12-DEC-2018 ET";

на

 String dateInputET ="12-DEC-2018 EDT";

'ET' не является распознанным часовым поясом.

...