Преобразование часовых поясов из строки в UT C (JODA TIME) - PullRequest
0 голосов
/ 12 марта 2020

У меня есть сохраненная временная метка UT C в базе данных. Когда я получаю эту метку времени UT C, я преобразую ее в строку. Я хочу взять эту строку UT C Timestamp и преобразовать ее в местное время устройства, используя Joda Time. Любой, кто мог бы помочь с этим. Это было бы очень ценно! Вот что я делаю сейчас:

                String date = ""+ds.child("datecreated").getValue();

                DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

                DateTime dt = formatter.parseDateTime(date);

                DateTime dt2 = new DateTime(dt).toDateTime(DateTimeZone.getDefault());

                String personalDate = dt2.toString();

                dateTV.setText(personalDate);

                System.out.println("THIS IS THE FIRST TIME: " + dt + "THIS IS THE SECOND TIME: " + dt2); 

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

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Чтобы показать, что Андреас в комментарии достиг цели: я выполнил следующий фрагмент в часовом поясе America / Coral_Harbour (так как я не знал ваш точный часовой пояс, восточное стандартное время используется в нескольких (хотя и меньше после 8 марта, когда началось восточное летнее время)).

    String date = "2020-03-12T01:23:45.678+0000";

    System.out.println("This is the string:      " + date); 

    DateTime dt = new DateTime(date);
    DateTime dt2 = new DateTime(dt).toDateTime(DateTimeZone.getDefault());

    System.out.println("This is the first time:  " + dt); 
    System.out.println("This is the second time: " + dt2); 

Вывод:

This is the string:      2020-03-12T01:23:45.678+0000
This is the first time:  2020-03-11T20:23:45.678-05:00
This is the second time: 2020-03-11T20:23:45.678-05:00

Сравните первые две строки и обратите внимание, что преобразование из UT C в EST уже произошло при разборе строки.

В качестве отступления, поскольку ваша строка имеет формат ISO 8601, вам не нужно указывать какой-либо форматер для ее анализа. Конструктор DateTime(Object) принимает его. Но то же самое преобразование произошло в вашем анализе.

Что произошло в вашем коде?

Повтор цитаты из комментария Андреаса:

Если withOffsetParsed() имеет вызывается, тогда результирующий DateTime будет иметь фиксированное смещение на основе проанализированного часового пояса. В противном случае результирующий DateTime будет иметь зону этого форматера, но проанализированная зона, возможно, вызвала настройку времени.

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

Итак, при создании dt2 вы конвертировали из восточного стандартного времени в восточное стандартное время и поэтому снова получили ту же дату-время.

Ссылка: Документация DateTimeFormatter.parseDateTime()

1 голос
/ 12 марта 2020

Часть, которую вы упускаете, заключается в том, что, как заявляет JavaDo c, объект DateTime внутренне представлен числом "миллисекунд" от Java эпохи 1970-01-01T00: 00: 00Z . "

Итак, у DateTime нет часового пояса. Два объекта DateTime, которые представляют один и тот же момент времени, абсолютно одинаковы, независимо от часового пояса, представленного в строке, из которой вы его проанализировали.

DateTime только «имеет» часовой пояс при его форматировании. Когда вы форматируете его, вы получите строку с часовым поясом, который вы запросили, и представление времени будет соответствующим образом скорректировано.

Причина, по которой две даты (dt и d2) выглядят одинаково для вас, заключается в том, что вы не отформатировали их (вы использовали их неявные методы "toString ()"), поэтому оба формата были отформатированы с использованием вашего местного часового пояса.

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