簡體   English   中英

在 Java 中將 EST 轉換為 EDT,反之亦然

[英]Converting EST to EDT or vice versa in Java

誰能說說三件事:

  1. 如何從 java.util.Date 實例中檢索 TimeZone?
  2. 如何知道夏令時是否適用?
    我想我可以通過執行 timeZone.getDSTSavings 來知道它,但我面臨的問題是,即使我將系統日期設為 2012 年 2 月 1 日,我仍然得到正值(我猜是 3600000)
  3. 如何將 EST 時間轉換為 EDT,反之亦然?

如何從 java.util.Date 實例中檢索 TimeZone?

沒有這樣的事情。 Date表示自 Unix 紀元(UTC 1970 年 1 月 1 日午夜)以來的毫秒數。 它與特定的日歷系統或時區無關。 換句話說,如果一個朋友和我一起打電話(零延遲;)並且我點擊我的手指,我們都會同意點擊的Date - 即使我正在使用公歷他使用儒略歷,即使我在倫敦而他在紐約。 這是同一個瞬間

如何知道夏令時是否適用?,我想我可以通過執行 timeZone.getDSTSavings 來了解它,但我面臨的問題是,即使我將系統日期設為 2012 年 2 月 1 日,我仍然得到正值(我猜3600000)

理想情況下,使用Joda Time而不是java.util.Date / Calendar / TimeZone ,但在TimeZone您可以使用TimeZone.getOffset(long)來查找與 UTC 的偏移量,或者TimeZone.inDaylightTime(Date)只是給您一個 yes/沒有答案。

如何將 EST 時間轉換為 EDT,反之亦然?

通常這是一個無效的問題-因為在任何時間一個實例,無論是ESTEDT適用。 您通常會從一個時區轉換為另一個時區,而“EDT”和“EST”並不是不同的時區——它們是同一時區內的不同偏移量。 您要求這樣做的事實表明您可能一開始就對數據進行了錯誤的建模(不幸的是,使用日期/時間值很容易做到這一點)。 請向我們提供更多信息,我們或許可以為您提供更多幫助。

  1. 如何從 java.util.Date 實例中檢索 TimeZone?

您可以通過以 toString() 格式查看實例化日期對象的時區。 例如“2013 年 5 月 1 日星期三 12:00:00 EDT”。

如何知道夏令時是否適用?,我想我可以通過執行 timeZone.getDSTSavings 來了解它,但我面臨的問題是,即使我將系統日期設為 2012 年 2 月 1 日,我仍然得到正值(我猜是 3600000) 3. 如何將 EST 時間轉換為 EDT,反之亦然? 這是我的關鍵問題

日期對象將自動說明 EDT/EST。 例如,如果您有一個 11 月 28 日的實例化日期對象,那么 toString() 將包含 EST 而不是 EDT。

我最初遇到的問題是我試圖將 EST 用於夏令時處於活動狀態的日歷日期,而 Date 對象通過向我的時間添加一個小時並顯示 EDT 來自動糾正我的錯誤。

我遇到了類似的問題。 以下解決方案在 Matlab 中但調用 Java,我的更改只是注釋,因為我正在使用 Matlab datenum 值。 您實際上無法轉換時區感知值,因為它們是相同的時區,但這可能有助於處理不感知時區的原始值。

%c1 GregorianCalendar of now
%c2 GregorianCalendar of date in question
tz1 = c1.getTimeZone; %Note t2 would be the same

in1 = tz1.inDaylightTime(c1.getTime);
in2 = tz1.inDaylightTime(c2.getTime);

if (in1 == in2)
    %do nothing
elseif in1
    %c1 EDT, c2 is EST
    %Subtract 1 hour to c2
else
    %c1 EST, c2 EDT
    %Add 1 hour to c2
end

Date 以毫秒為單位存儲自 1970 紀元以來的時間,因此不包含時區信息。 您的 JVM 有一個語言環境集,用於定義此日期的顯示方式。

如果您想了解 JVM 設置的時區,請調用“TimeZone.getDefault()”

擁有 TimeZone 對象后,您可以調用許多函數來確定該時區的夏令時是否適用於給定日期:

  • 白天時間(日期)

(粗略地)確定兩個時區之間的差異:

long edtOffset = TimeZone.getTimeZone("EDT").getOffset(date.getTime());
long estOffset = TimeZone.getTimeZone("EST").getOffset(date.getTime());
long diff = estOffset - edtOffset;

雖然我不確定這有多有效,因為 EST 和 EDT 是互斥的,而且上面的代碼是否會給你你感興趣的結果(我沒有測試過)

暫無
暫無

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

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