SImpleDateFormat возвращает неправильное значение с GMT + 6,5 - PullRequest
0 голосов
/ 17 апреля 2019

У меня время UTC в длинном значении: 1555415100000L

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

//data.getTime() = 1555415100000L
String timeFormat = "HH:mm";
SimpleDateFormat sdf = new SimpleDateFormat(timeFormat);
long gmtTime = Long.parseLong(data.getTime()) + TimeZone.getDefault().getRawOffset();
String timeString = sdf.format(new Date(gmtTime));

В GMT + 7: timeString = 01:45 (исправить)

Но в GMT + 6.5: timeString = 00:45 (неверно) -> должно быть 01: 15

Есть ли у вас какие-либо предложения по точному местному времени?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Несколько вещей:

  • Управление меткой времени путем добавления или вычитания смещений никогда не является правильным способом преобразования часовых поясов на любом языке. Всегда ищите API, которые позволяют вам работать с идентификаторами часовых поясов . Если вы манипулируете метками времени, вы сознательно выбираете другой момент времени. Это не та же концепция, что и для местного часового пояса.

  • В мире есть только два часовых пояса, которые используют +6,5. Это Asia/Yangon (в Мьянме) и Indian/Cocos (на Кокосовых / Килинских островах). Вы должны использовать один из них вместо этого.

  • Ваше утверждение о местном времени этой временной метки неверно.

    • 1555415100000 соответствует времени UTC 2019-04-16T11:45:00.000Z
    • со смещением +7, то есть 2019-04-16T18:45:00.000+07:00 (18:45, а не 01:45, как вы указали)
    • со смещением +6,5, то есть 2019-04-16T18:15:00.000+06:30 (18:15, а не 01:15, как вы заявили)
  • Вам следует рассмотреть возможность использования пакета java.time , представленного в Java 8. В Android вы можете использовать библиотеку ThreeTenABP , бэкпорт java.time. API для Android.

    import java.time.*;
    import java.time.format.*;
    
    ...
    
    long time = 1555415100000L;
    Instant instant = Instant.ofEpochMilli(time);
    ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of("Asia/Yangon"));
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
    System.out.println(formatter.format(zonedDateTime));  //=> "18:15"
    
  • Если вы действительно настаиваете на использовании старых API даты и времени, несмотря на все их очень хорошо задокументированные проблемы, тогда вам нужно установить часовой пояс вашего форматера вместо манипуляции с отметкой времени.

    import java.util.*;
    import java.text.*;
    
    ...
    
    long time = 1555415100000L;
    long date = new Date(time));
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
    sdf.setTimeZone(TimeZone.getTimeZone("Asia/Yangon"));
    System.out.println(sdf.format(date); //=> "18:15"
    
0 голосов
/ 17 апреля 2019

Пожалуйста, попробуйте преобразовать его как обычно, что-то вроде

long time = 1555415100000L;
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(sdf.format(new Date(time)));

Вывод, который я получил в онлайн-компиляторе Java: 16.04.19 11:45

Или, если конвертировать в GMT,

long time = 1555415100000L;
Date date = new Date(time);
DateFormat gmt = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
gmt.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(gmt.format(date));

Выход в онлайн-компилятор: 16 апреля 2019 г., 11:45:00 по Гринвичу

Надеюсь, это поможет.

...