Местное время для UTC в Java

Я пытаюсь преобразовать локальное время в 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 FORMATTED DATE: 2018-12-31T18: 07: 00.000Z

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

Всего 1 ответ


ТЛ; др

Используйте современные классы 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 . И поиск Stack Overflow для многих примеров и объяснений. Спецификация - 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 и Java SE 7
    • Большая часть функциональности java.time портирована на Java 6 и 7 в ThreeTen-Backport .
  • Android

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


Есть идеи?

10000