Так же, как и LotR, преобразования TimeZone в Java - это просто сага. Мое требование простое. Проблема заключается в использовании миллисекунд для создания объектов DateTime.
Мне нужно иметь возможность использовать местное время в миллисекундах, затем преобразовать его в UT C в миллисекундах и затем преобразовать обратно в то же местное время все используют миллисекунды. Я получил некоторый способ с JodaTime, но преобразование времени UT C миллисекунд назад к исходному местному времени в примере ниже было проблемой. Вот где я получил:
public static final TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
public static final String DATETIME_REVERSE = "yyyy-MM-dd 'T' HH:mm:ss";
private void thereAndBackAgain() {
long nowTimeNumber = 1585715400000L;
DateTime nowDt = new DateTime(nowTimeNumber);
DateTimeFormatter formatter = DateTimeFormat.forPattern(DATETIME_REVERSE);
// Get local time
Timber.e(" -- 1. Local Time :" + nowDt.getMillis() + " -> " + formatter.print(nowDt));
// Convert Local to UTC
DateTime utcTime = nowDt.withZone(DateTimeZone.UTC); // Convert to UTC.
String utcTimeStr = formatter.print(utcTime);
long utcOfLocalInMilli = formatter.parseDateTime(utcTimeStr).withZone(DateTimeZone.UTC).getMillis();
Timber.e(" -- 2. UTC Time :" + utcOfLocalInMilli + " -> " + formatter.print(utcTime));
// Convert UTC back to Local
DateTime utc2 = new DateTime(utcOfLocalInMilli, DateTimeZone.UTC);
DateTimeFormatter formatter2 = DateTimeFormat.forPattern(DATETIME_REVERSE);
String utc2str = formatter2.print(utc2);
long localOfUtcInMillis = formatter2.parseDateTime(utc2str).withZone(DateTimeZone.getDefault()).getMillis();
Timber.e(" -- 3. Local Time :" + localOfUtcInMillis + " -> " + utc2str);
}
Вывод:
-- 1. Local Time :1585715400000 -> 2020-04-01 T 15:30:00
-- 2. UTC Time :1585675800000 -> 2020-04-01 T 04:30:00
-- 3. Local Time :1585636200000 -> 2020-03-31 T 17:30:00
У меня проблема в том, что когда я создаю utc2, JodaTime по-прежнему предполагает, что значение в миллисекундах равно местный часовой пояс, даже если я объявляю его с часовым поясом UT C. Но я, скорее всего, неправильно понял использование этого конструктора.
По сути, я хочу иметь возможность взять время из любого часового пояса, преобразовать в UT C в миллисекундах, а затем преобразовать его обратно в любой другой часовой пояс. Значение миллисекунды требуется для ключа базы данных. Этот пример просто берет местное время и преобразует его обратно в то же время, но в идеале он предназначен для преобразования из одного часового пояса в другой, при этом используется значение времени в одну миллисекунду, а затем выполняется корректировка для зоны.