2015-04-21 68 views
0

新的JodaTime庫,我想獲得DateTime的毫秒字段與指定的時區的偏移量。 到目前爲止,我的嘗試是:Jodatime得到毫秒與偏移量

 private DateTimeZone   timeZone = DateTimeZone.forID("Europe/Amsterdam"); 
    private long now=new DateTime().withZone(timeZone).getMillis(); 

但我總是得到UTC米利斯,時區偏移心不是應用, 有什麼辦法來應用時區的偏移到DateTime對象? Thx!

+0

是的,剛纔,thx – JBoy

回答

2

首先:你打算如何處理這些「本地」毫米?你真的想達到什麼?通常只需要UTC-millis。

無論如何,請記住,一般區偏移的定義是:

UTC +偏移=當地時間

然後解決方法很簡單:

DateTimeZone tz = DateTimeZone.forID("Europe/Amsterdam"); 
long nowUTC = new DateTime().withZone(tz).getMillis(); 
long nowLocal = nowUTC + tz.getOffset(nowUTC); 

但再次:你對「本地」毫米的用例是什麼?由於UTC鏈接被切斷,它們甚至不再與UNIX紀元相關。

關於你的最後一個問題(「有沒有什麼辦法來應用時區的偏移到DateTime對象?」):

DateTime -object已經得到了一個時區,即「歐洲/阿姆斯特丹」。一旦您擁有自UNIX時代以來以毫秒錶示的全局UTC時間戳,它就會在內部用於計算字段元組表示。無需在DateTime上應用額外的偏移量。它已經在那裏。

+0

thx meno,我會嘗試這個,只要我到我的機器,讓你知道 – JBoy

0

JodaTime正在使用裏面的機器時間。所以要找到毫秒,你可以使用一個常數存儲LocalDateTime參考Jan 1, 1970(因爲UNIX Time)。

Unix時間,或POSIX時間,是,不計算飛躍 定義爲自1970年1月1日午夜proleptic 協調通用時間(UTC)經過的秒數爲在時間來描述點的系統, 秒。

然後計算您的DateTime之間的差異。

我試過這樣;

public static void main(String[] args) { 
     final LocalDateTime JAN_1_1970 = new LocalDateTime(1970, 1, 1, 0, 0); 
     DateTime local = new DateTime().withZone(DateTimeZone.forID("Europe/Amsterdam")); 
     DateTime utc = new DateTime(DateTimeZone.UTC); 

     System.out.println("Europe/Amsterdam milis :" + new Duration(JAN_1_1970.toDateTime(DateTimeZone.forID("Europe/Amsterdam")), local).getMillis()); 
     System.out.println("UTC milis    :" + new Duration(JAN_1_1970.toDateTime(DateTimeZone.UTC), utc).getMillis()); 

    } 

而結果是;

Europe/Amsterdam milis :1429695646528 
UTC milis    :1429692046534 

和@leonbloy寫here一個很好的評論。

您的本地和utc代表相同的時間點(僅在連接了 不同的時區時)。因此,getMillis()(它給出 「物理」時間間隔從對應於 unix時期的「即時」開始)必須返回相同的值。

我也會尋找更好的解決方案,沒有常數。