Joda-time: Как вы конвертируете местное время в UT C, а затем конвертируете в другое местное время, используя только миллисекунды? - PullRequest
0 голосов
/ 16 апреля 2020

Так же, как и 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 в миллисекундах, а затем преобразовать его обратно в любой другой часовой пояс. Значение миллисекунды требуется для ключа базы данных. Этот пример просто берет местное время и преобразует его обратно в то же время, но в идеале он предназначен для преобразования из одного часового пояса в другой, при этом используется значение времени в одну миллисекунду, а затем выполняется корректировка для зоны.

...