Как преобразовать время в UTC, а затем местное время устройства - PullRequest
0 голосов
/ 10 октября 2019

Я получаю в следующий раз из службы

'11 ноября 2019 г. 19:30'

Я знаю, что это центральное время США, мне нужно получить часымежду текущим временем и временем этого события, но я не могу понять, как преобразовать эту дату в UTC.

Я использую следующий подход, но, похоже, это не работает нормально.

   public Date ticketJSONDateFormatter(String dateTime){

            SimpleDateFormat simpleDateFormatter = new SimpleDateFormat("MMM d yyyy HH:mm a");

            Date parsedDate= null;
            try {

                simpleDateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
                parsedDate= simpleDateFormatter.parse(dateTime);

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

            return parsedDate;
        }   

Этот метод возвращает следующее date

Fri Oct 11 12:30:00 GMT+05:00 2019

Хотя ожидаемый результат может быть примерно таким. Мое устройство в (+5: 00 UTC)

Fri Oct 12 12:30:00 GMT+05:00 2019

Ответы [ 2 ]

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

Вы можете использовать LocalDateTime для анализа строки на дату,

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd yyyy hh:mm a");
String date = "Nov 11 2019 07:30 PM";
LocalDateTime ldt = LocalDateTime.parse(date, formatter);

Затем преобразовать ее в предпочитаемую зону,

Instant cdt = ldt.atZone(ZoneId.of("America/Chicago")).toInstant();
return cdt.atOffset(ZoneOffset.UTC)

Это вернет Instant.

И, как предложил Оле В.В. в комментарии, я бы не рекомендовал использовать старые Date и Calendar API. Я бы предложил прочитать этот ответ , чтобы понять проблемы, связанные со старым Date API.

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

Вы можете получить это, выполнив следующие действия:

  1. Используйте ZonedDateTime.parse для анализа времени, которое вы получаете.
  2. Преобразование времени в Центральную Америку вваше местное время.
  3. Получите ваше текущее время.
  4. Найдите разницу между вашим текущим временем и временем события, преобразованным в ваше местное время.

Пример:

    // Parsing the time you are receiving in Central Time Zone. Using Chicago as a representative Zone.
    String dateWithZone = "Nov 11 2019 7:30 PM".concat("America/Chicago") ;
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd uuuu h:m aVV");

    ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateWithZone, formatter);
    System.out.println(zonedDateTime); // This is the time you received in Central time zone.

    // Now convert the event time in your local time zone
    ZonedDateTime eventTimeInLocal = zonedDateTime.withZoneSameInstant(ZoneId.systemDefault());

    // Then find the duration between your current time and event time
    System.out.println(Duration.between(ZonedDateTime.now(), eventTimeInLocal).toHours());

Класс продолжительности предоставляет множество других утилит для получения более точной продолжительности.

...