Вы можете и, возможно, должны будете использовать 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