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 LocalDateTime
e 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_online
tem o valor:
2020-03-12 03:01:45.0
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 LocalDateTime
e que LocalDateTime
pode então ser convertido para um ZonedDateTime
adicionando 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 ZonedDateTime
está sendo criado.
Mas se você não quiser apenas adicionar uma zona mas realmente converter o Instant
para outra zona, então você pode fazer isso:
Convertendo o Instant
para 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