Как настроить метку времени из моей базы данных? - PullRequest
2 голосов
/ 19 марта 2020

В базе данных время сохраняется как метка времени в часовом поясе UT C (то есть 0). Когда я получу его, мне нужно добавить часовой пояс из того места, которое я отправлю. У меня есть эти две части информации, но я не могу найти время.

Это код, из которого я получаю обе информации. Я пытался преобразовать в LocalDateTime и настроить зону, но это не дало никаких результатов. Нет большого кода:

Timestamp timestamp = resultQueryCamerasOffline.getLastOnline();
String zoneId = resultQueryCamerasOffline.getEmpresaTimezone();
System.out.println(timestamp.toString());
System.out.println(zoneId);

2020-03-12 03: 01: 45.0

America / São_Paulo

В базе данных , last_online имеет значение:

2020-03-12 03:01:45.0

Ответы [ 2 ]

3 голосов
/ 19 марта 2020

Вы можете и, возможно, должны будете использовать LocalDateTime для достижения того, чего хотите, но конечный продукт должен быть ZonedDateTime.

По сути, метка времени должна быть преобразована в LocalDateTime и что LocalDateTime можно затем преобразовать в ZonedDateTime, добавив спецификацию c ZoneId, например:

Просто добавьте зону, оставив дату и время как:

public static void main(String[] args) {
    // get or take a timestamp
    java.sql.Timestamp timestamp = Timestamp.valueOf("2020-03-12 03:01:45.0");
    // transforming it into a LocalDateTime
    LocalDateTime localDateTime = timestamp.toLocalDateTime();
    // now create a ZonedDateTime by putting a zone
    ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime,
                                                    ZoneId.of("America/Sao_Paulo"));
    // and print the result
    System.out.println(zonedDateTime);
}

Вывод

2020-03-12T03:01:45-03:00[America/Sao_Paulo]

Если вы уверены, что клиент, который запускает этот код, всегда имеет нужный часовой пояс, то вы можете альтернативно использовать ZoneId.systemDefault() при создании ZonedDateTime .

Но если вы не просто хотите добавить зону, но действительно конвертируете Instant в другую зону, то вы можете сделать это:

Преобразование Instant в другой часовой пояс:

public static void main(String[] args) {
    // get or take a timestamp
    java.sql.Timestamp timestamp = Timestamp.valueOf("2020-03-12 03:01:45.0");
    // transforming it into a LocalDateTime
    LocalDateTime localDateTime = timestamp.toLocalDateTime();
    // now create a ZonedDateTime by putting a zone
    ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(
            localDateTime.toInstant(ZoneOffset.of("+00:00")),
            ZoneId.of("America/Sao_Paulo"));
    // and print the result
    System.out.println(zonedDateTime);
}

Это выводит

2020-03-12T00:01:45-03:00[America/Sao_Paulo]

Вы можете иметь второй короче:

public static void main(String[] args) {
    // get or take a timestamp
    java.sql.Timestamp timestamp = Timestamp.valueOf("2020-03-12 03:01:45.0");
    // transforming it into a LocalDateTime
    ZonedDateTime utc = ZonedDateTime.of(timestamp.toLocalDateTime(), ZoneId.of("UTC"));
    // now create a ZonedDateTime by putting a zone
    ZonedDateTime saoPaulo = utc.withZoneSameInstant(ZoneId.of("America/Sao_Paulo"));
    // and print the result
    System.out.println(saoPaulo);
}

Выход остается

2020-03-12T00:01:45-03:00[America/Sao_Paulo]

Если вы хотите, чтобы вывод форматировался по-другому, вы должны выбрать один из встроенных шаблонов (publi c co константы DateTimeFormatter, например, DateTimeFormatter.ISO_ZONED_DATE_TIME) или присвоить ей пользовательскую (DateTimeFormatter.ofPattern(String pattern) плюс необязательную Locale):

public static void main(String[] args) {
    // get or take a timestamp
    java.sql.Timestamp timestamp = Timestamp.valueOf("2020-03-12 03:01:45.0");
    // transforming it into a LocalDateTime
    ZonedDateTime utc = ZonedDateTime.of(timestamp.toLocalDateTime(), ZoneId.of("UTC"));
    // now create a ZonedDateTime by putting a zone
    ZonedDateTime saoPaulo = utc.withZoneSameInstant(ZoneId.of("America/Sao_Paulo"));
    // create a formatter for your locale and with the desired pattern
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEEE dd MMM yyyy hh:mm:ss a xxx",
            Locale.forLanguageTag("pt-BR"));
    // and print the result
    System.out.println(saoPaulo.format(dtf));
}

На этот раз вывод отформатирован совершенно по-другому:

Quinta-feira 12 mar 2020 12:01:45 AM -03:00
0 голосов
/ 19 марта 2020

получите миллис из вашей отметки времени и попробуйте:

LocalDateTime date = LocalDateTime
.ofInstant(Instant.ofEpochMilli(timestamp.getTime()), ZoneId.systemDefault(yourTimezone()));

или попробуйте использовать ZonedDateTime

...