在数据库中,时间保存为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
,然后可以通过添加特定的ZoneId
将LocalDateTime
转换为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