Java - конвертировать данный DateTime в String в местный часовой пояс - PullRequest
0 голосов
/ 26 апреля 2020

Я читаю метку времени из базы данных в виде строкового значения, скажем:

2020-04-30T09: 59: 00.272-05: 00

. Теперь я должен сравнить это с текущей меткой времени в местном часовом поясе (системный часовой пояс)

Что я пробовал до сих пор:

ZonedDateTime result = ZonedDateTime.parse("2020-04-30T09:59:00.272-05:00"); System.out.println("Given : "+result); System.out.println("Given In Local: "+result.withZoneSameLocal(ZoneId.systemDefault()));

Выход: Given : 2020-04-30T09:59:00.272-05:00 Given In Local: 2020-04-30T09:59:00.272-05:00[America/Chicago]

Мой желаемый выход - "2020-04-30T14: 59: 00.272"

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Я считаю, что следующее должно соответствовать вашей цели.

    String dateTimeString = "2020-04-30T09:59:00.272-05:00";
    OffsetDateTime databaseDateTime = OffsetDateTime.parse(dateTimeString );
    OffsetDateTime currentDateTime = OffsetDateTime.now(ZoneId.systemDefault());
    if (databaseDateTime.isAfter(currentDateTime)) {
        System.out.println("" + databaseDateTime + " is after " + currentDateTime);
    } else {
        System.out.println("" + databaseDateTime + " is before or equal to " + currentDateTime);
    }

Вывод, когда я только что запустил код в моем часовом поясе (Европа / Копенгаген):

2020 -04-30T09: 59: 00.272-05: 00 после 2020-04-26T21: 48: 36.331752 + 02: 00

Поскольку ваша строка из базы данных содержит смещение UT C ( -05:00) и без часового пояса (например, America / New_York), я нашел более подходящим для анализа в OffsetDateTime. ZonedDateTime было бы излишним. По местному времени я передаю ZoneId.systemDefault() методу now из OffsetDateTime. Сравнение двух OffsetDateTime объектов с isAfter() прекрасно работает, даже если смещения разные, это учитывается. Есть также методы isBefore и isEqual для сравнения.

Шаг назад, в большинстве случаев вам не следует получать дату и время в виде строки из вашей базы данных. Ваш драйвер JDB C 4.2 или ваша современная реализация JPA, такая как Hibernate 5, будут рады получить для вас объект OffsetDateTime из базы данных. См. Например мой ответ здесь .

1 голос
/ 26 апреля 2020

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

    final String dateString = "2020-04-30T09:59:00.272-05:00";
    final ZonedDateTime result = ZonedDateTime.parse(dateString);
    System.out.println("Given         : " + result);
    final LocalDateTime localDateTime = OffsetDateTime.parse(dateString)
        .atZoneSameInstant(ZoneId.of("Europe/Berlin"))
        .toLocalDateTime();
    System.out.println("Given In Local: " + localDateTime);```

печатает

Given         : 2020-04-30T09:59:00.272-05:00
Given In Local: 2020-04-30T16:59:00.272

Кроме того, Вы также можете проанализировать его на ZonedDateTime и затем изменить часовой пояс, например

final LocalDateTime result = ZonedDateTime.parse(dateString)
        .withZoneSameInstant(ZoneId.of("Europe/Berlin"))
        .toLocalDateTime();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...