簡體   English   中英

如何在 Java8+ 中將 UTC 轉換為 EST java.util.date?

[英]How to convert UTC to EST java.util.date in Java8+?

我的代碼如下,可將 UTC 轉換為 EST。 但是,如何將 ZonedDateTime 轉換為 java.util.Date 從下面的代碼以及這種格式 (yyyy-MM-dd'T'HH:mm:ss)?

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
String f = "yyyy-MM-dd'T'HH:mm:ss";
String timestamp = "2022-03-01T16:29:03"; //sample input

TemporalAccessor temporalAccessor = formatter.parse(timestamp);
LocalDateTime localDateTime = LocalDateTime.from(temporalAccessor);
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
Instant result = Instant.from(zonedDateTime);
ZonedDateTime nyTime = result.atZone(ZoneId.of("Canada/Eastern"));
DateTimeFormatter format = DateTimeFormatter.ofPattern(f);
System.out.println("Date EST : " + format.format(nyTime));

一旦你在正確的時區有ZonedDateTime將它轉換為 Instant 然后使用方法public static Date from(Instant instant) of class Date。

Instant instant = Instant.from(zonedDateTime);
Date date = Date.from(instant);

但是,如果可以,請避免使用已過時的 Date class(雙關語) package java.time應使用ZonedDateTimeInstant等類

你評論說:

我需要在數據庫列中填充它。 所以我需要將 UTC 中的字符串轉換為 EST,然后以這種格式將 ZonedDateTime 轉換回 java.util.Date (yyyy-MM-dd'T'HH:mm:ss)

永遠不要使用任何Date class。僅使用java.time類。 JDBC 4.2 及更高版本支持java.time與數據庫交換日期時間值。

  • 對於類似於 SQL 標准類型TIMESTAMP WITHOUT TIME ZONE的類型的列,請使用java.time.LocalDateTime
  • 對於類似於 SQL 標准類型TIMESTAMP WITH TIME ZONE的類型的列,請使用java.time.OffsetDateTime

您的輸入字符串:

String timestamp = "2022-03-01T16:29:03";

……名字不對。 該值缺少時區指示符或與 UTC 的偏移量。 所以它不能代表一個時刻。 我們無法知道日本東京、法國圖盧茲或美國俄亥俄州托萊多的帽子時間是下午 4:30 左右——所有這些時間都相隔幾個小時,時間非常不同。 所以稱其為“時間戳”具有誤導性。

將該輸入字符串解析為LocalDateTime 無需指定格式化模式。 該字符串符合 ISO 8691,在解析/生成文本時默認在java.time 類中使用。

LocalDateTime ldt = LocalDateTime.parse( "2022-03-01T16:29:03" ) ;

此時您的代碼似乎很復雜。 您將默認時區分配給此日期時間。 但這似乎不太可能說得通。 我猜你的意圖是讓這個特定的日期和時間代表在特定時區看到的特定時刻。

顯然你想要加拿大東部時區。 區域的正確名稱America/Toronto

ZoneId z = ZoneId.of( "America/Toronto" ) ;

分配該區域以生成ZonedDateTime object。

ZonedDateTime zdt = ldt.atZone( z ) ;

現在我們有時間,時間軸上的一個特定點。

但是為了寫入類似於 SQL 標准TIMESTAMP WITH TIME ZONE類型的數據庫列,我們需要使用OffsetDateTime

OffsetDateTime odt = zdt.toOffsetDateTime() ;

后來您評論說輸入字符串旨在表示 UTC 中的時刻。 因此,分配一個ZoneOffset object,常量UTC ,以獲得一個OffsetDateTime

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;

發送到數據庫。

myPreparedStatement.setObject( … , odt ) ;

恢復。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

如果一定要用java.util.Date和還沒有更新到java.time的舊代碼互操作,可以來回轉換。 查看添加到舊類的新to…from…方法。

java.util.Date d = Date.from( odt.toInstant() ) ;
java.util.Date d = Date.from( zdt.toInstant() ) ;

往另一個方向走。

Instant instant = myJavaUtilDate.toInstant() ;

所有這些主題都已在 Stack Overflow 上多次提及。 搜索以了解更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM