Como ajustar a hora que vem do meu banco de dados?

FearX:

Na base de dados, uma vez que é guardado como um carimbo de hora na zona de tempo UTC (isto é, 0). Quando eu obtê-lo, eu preciso adicionar o fuso horário do lugar em que enviarei. Eu tenho essas duas informações, mas não consigo encontrar o tempo.

Este é o código a partir do qual eu recebo tanto informações. Tentei transformar a LocalDateTimee ajustar a zona, mas não produziu nenhum resultado. Não há muito do código:

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

Na base de dados, last_onlinetem o valor:

2020-03-12 03:01:45.0
deHaar:

Você pode e talvez ter que usar um LocalDateTime, a fim de conseguir o que deseja, mas o produto final deve ser um ZonedDateTime.

Basicamente, o timestamp deve ser convertido para um LocalDateTimee que LocalDateTimepode então ser convertido para um ZonedDateTimeadicionando um específico ZoneId, como este:

Basta adicionar uma zona, deixando a data e hora como é:

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);
}

A saída é

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

Se você tem certeza que o cliente que executa este código tem sempre o fuso horário desejado, então você pode usar como alternativa ZoneId.systemDefault()quando o ZonedDateTimeestá sendo criado.

Mas se você não quiser apenas adicionar uma zona mas realmente converter o Instantpara outra zona, então você pode fazer isso:

Convertendo o Instantpara outro fuso horário:

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);
}

este saídas

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

Você pode ter o segundo mais curto:

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);
}

As estadias de saída

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

Se você quer a saída formatada de maneira diferente, você tem que optar entre um dos built-in padrões (constantes públicas de DateTimeFormatter, como DateTimeFormatter.ISO_ZONED_DATE_TIME) ou dar-lhe um costume (por DateTimeFormatter.ofPattern(String pattern)mais um opcional 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));
}

Desta vez, a saída é formatado de uma maneira totalmente diferente:

Quinta-feira 12 mar 2020 12:01:45 AM -03:00

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=318444&siteId=1
Recomendado
Clasificación