TimeFormat всегда из указанного c часового пояса - PullRequest
3 голосов
/ 18 февраля 2020

У меня проблема с форматом даты. Я создаю приложение, в котором я не могу отформатировать время из текущей локали, но всегда из указанного c локали UTC + 1 или указанного c состояния, но я не знаю как.

SimpleDateFormat("d.M.yyyy  HH:mm", Locale.getDefault()).format(Date(date))

Мне нужно установить локаль или часовой пояс, как постоянные, которые не зависят от физического положения или настроек телефона.

У меня всегда есть данные в UT C -0, но мне нужно преобразовать их в UTC + 1 (или другое) и показать пользователям.

Спасибо за любую помощь

За время синхронизации c Я использую библиотеку TrueTime

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Вот пример java.time, который использует ZonedDateTime, созданный в определенный момент времени, то есть Instant в упомянутом пакете:

public static void main(String[] args) {
    // get a representation of a moment in time (not a specific date or time)
    Instant now = Instant.now();
    // then use that in order to represent it in a specific zone using an offset of -1 hour
    ZonedDateTime utcZdt = ZonedDateTime.ofInstant(now, ZoneOffset.ofHours(-1));
    // and use it again in order to have another one defined by a specific time zone
    ZonedDateTime laZdt = ZonedDateTime.ofInstant(now, ZoneId.of("America/Los_Angeles"));

    // and print the representation as String
    System.out.println(utcZdt.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
    System.out.println(laZdt.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
}

Выходные данные

2020-02-18T14:31:21.714-01:00
2020-02-18T07:31:21.714-08:00[America/Los_Angeles]

В качестве альтернативы вы можете использовать OffsetDateTime того же пакета.

Ключом является использование Instant, полученного из эпохи миллиса. Эти значения в миллисекундах также являются моментами времени, независимо от зон или смещений.

Вы кодируете приложение Android, поэтому вам, возможно, придется использовать ThreeTenABP , a Backport почти всей функциональности java.time для уровней API ниже Android 26.

Я думаю, что в настоящее время использование java.time или его обратного порта является наименее хлопотным и наиболее простым способом решать задачи, подобные вашей.

2 голосов
/ 18 февраля 2020

Это то, что вы ищете?

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d.M.yyyy  HH:mm");

LocalDateTime localDateTime = LocalDateTime.parse(dateTimeString, formatter);

ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("UTC+1"));
...