如何调整来自我的数据库的时间戳



在数据库中,时间保存为UTC时区的时间戳(即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

美国/圣保罗

在数据库中,last_online具有值:

2020-03-12 03:01:45.0

您可以也可能必须使用LocalDateTime才能实现您想要的目标,但最终产品应该是ZonedDateTime

基本上,时间戳应该转换为LocalDateTime,然后可以通过添加特定的ZoneIdLocalDateTime转换为ZonedDateTime,如下所示:

只需添加一个区域,将日期时间保持原样:

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]

如果您确信运行此代码的客户端始终具有所需的时区,那么您也可以在创建ZonedDateTime时使用ZoneId.systemDefault()

但是如果您不只是想添加一个区域,而是真的将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]

如果您想要不同格式的输出,您必须选择一个内置模式(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

从时间戳中获取毫秒并尝试:

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

或者尝试使用ZonedDateTime

最新更新