[英]How to adjust a Timestamp that comes from my database?
在數據庫中,時間被保存為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
和LocalDateTime
然后可以轉化為ZonedDateTime
通過添加特定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]
如果您確定運行此代碼的客戶端始終具有所需的時區,那么您也可以在創建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)
(通過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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.