Местное время до UTC на Яве - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь преобразовать местное время в UTC по времени в Java.Я написал код:

    String datesToConvert = "31-12-2018 23:37:00";
    String dateFormat = "dd-MM-yyyy HH:mm:ss";

    SimpleDateFormat sdf2 = new SimpleDateFormat(dateFormat);
    sdf2.setTimeZone(TimeZone.getDefault());
    Date gmt = null;

    SimpleDateFormat sdfOutPutToSend = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    sdfOutPutToSend.setTimeZone(TimeZone.getTimeZone("UTC"));

    try {
        gmt = sdf2.parse(datesToConvert);
        System.out.println("UTC FORMATTED DATE : " + sdfOutPutToSend.format(gmt));

    } catch (Exception e) {
        e.printStackTrace();
    }

Выходные данные, которые я получаю: ОТформатированная UTC: 2018-12-31T18: 07: 00.000Z

Но я хочу, чтобы это была та же датаи время, но, наконец, изменяется в .000Z, что показывает разницу во времени.

1 Ответ

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

tl; dr

Используйте современные java.time классы.

LocalDateTime
.parse( 
    "31-12-2018 23:37:00" , 
    DateTimeFormatter.ofPattern( "dd-MM-uuuu HH:mm:ss" )
)
.atOffset(
    ZoneOffset.UTC 
)
.toString()

2018-12-31T23: 37Z

java.time

Используйте современные java.time классы, а не такие ужасные унаследованные классы, как Date.

Анализируйте вашу входную строку как LocalDateTime, поскольку в нем отсутствует индикатор часового пояса или смещения от UTC, и, следовательно, не представляет момент.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( "31-12-2018 23:37:00" , f ) ;

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

Укажите правильное имя часового пояса в форматеcontinent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland.Никогда не используйте 2-4 буквенные сокращения, такие как EST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

Ваш вопрос неясен.Но, возможно, вы говорите, что ввод был предназначен для представления момента в UTC.Если это так, примените константу ZoneOffset.UTC, чтобы получить объект OffsetDateTime.

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;

Желаемый результат: 2018-12-31T23: 37: 00.808Z

Это невозможно, так как вашей входной строке не хватало доли секунды .808.

Окончание, которое вы указали как проблему, .000Z будет правильным, поскольку нули означают, что доли секунды нет.Z в конце означает UTC (смещение от UTC, равное нулю), сокращение от +00:00 и произносится Zulu.


О 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 и больше .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...