2013-09-25 104 views
48

我從數據庫這是我設置成JodaTime DateTime實例在喬達時間如何時區轉換不改變時間

DateTime dt = new DateTime(timestamp.getTime()); 

它存儲的時間越來越UTC時間戳完全說10:00 AM,但與當地時區。例如,我在IST時區是從UTC +5:30的地區

我已經嘗試了很多事情來改變時區,但每件事情從10:00 AM更改爲其他東西通過使用+5:30差異

有沒有什麼辦法讓我可以更改時區,而不會影響當前時間

編輯: 如果我現在的時間是:

2013-09-25 11:27:34 AM  UTC 

以下是結果,當我使用這個new DateTime(timestamp.getTime());

2013-09-25 11:27:34 AM Asia/Kolkata 

而且下面是結果,當我使用這個new DateTime(timestamp.getTime(), DateTimeZone.UTC);

2013-09-25 05:57:34 AM UTC 
+0

嗨。你能告訴我哪種方法適合你嗎? –

+0

@ShajeelAfzal當我不想玩弄時區時,我大多使用'LocalDateTime' – Abhi

回答

35

您可以使用類LocalDateTime

LocalDateTime dt = new LocalDateTime(t.getTime()); 

和 「當前時區,因爲1970y米利斯」 轉換LocalDateTimeDateTime

DateTime dt = new LocalDateTime(timestamp.getTime()).toDateTime(DateTimeZone.UTC); 

喬達DateTime對待任何時候像米利斯。因此,當您創建DateTime實例時,它將使用當前時區創建。

+0

請檢查編輯,我已經提到了那裏的輸出 – Abhi

+0

它使用'LocalDateTime',但爲什麼DateTime的行爲是這樣的?有沒有解決方案? – Abhi

+0

@Ahi什麼是'時間戳'? 'java.util.Date'或'java.sql.Timestamp'? – Ilya

44

您可以使用withZoneRetainFields()方法DateTime更改時區而不更改日期中的數字。

+2

請謹慎使用這種情況,因爲如果您在夏令時配置環境中使用時間偏移,它可能會引發異常。如果你有文本的日期,你可能更喜歡這樣的解決方案http://stackoverflow.com/questions/5451152/how-to-handle-jodatime-illegal-instant-due-to-time-zone-offset-transition? answertab =票#製表頂 – rattek

2

這裏是我如何做到這一點:

private DateTime convertLocalToUTC(DateTime eventDateTime) { 

     // get your local timezone 
     DateTimeZone localTZ = DateTimeZone.getDefault(); 

     // convert the input local datetime to utc 
     long eventMillsInUTCTimeZone = localTZ.convertLocalToUTC(eventDateTime.getMillis(), false); 

     DateTime evenDateTimeInUTCTimeZone = new DateTime(eventMillsInUTCTimeZone); 

     return evenDateTimeInUTCTimeZone.toDate(); 
} 
8

如果你的時間戳記是: 2015-01-01T00:00:00.000-0500 (這是當地時間[我])

嘗試這樣的:

DateTime localDt = new DateTime(timestamp.getTime()) 
    .withZoneRetainFields(DateTimeZone.UTC) 
    .withZone(DateTimeZone.getDefault()); 

2014-12-31T19:00:00.000-05:00

Breaki納克下來: 這給你相應的時間戳的日期時間,指定它是在UTC:

new DateTime(timestamp.getTime()) 
    .withZoneRetainFields(DateTimeZone.UTC) 

2015-01-01T00:00:00.000Z

這給你一個DateTime但轉換到本地時間的時間:

new DateTime(timestamp.getTime()) 
    .withZoneRetainFields(DateTimeZone.UTC) 
    .withZone(DateTimeZone.getDefault()); 

2014-12-31T19:00:00。000-05:00

0

另外我還有另一種方法對我很有幫助。 我希望將我的工作流程線程臨時更改爲特定的時區(節省時間),然後當我的代碼完成後,我再次設置原始時區。 事實證明,當你使用喬達庫,這樣做的:

TimeZone.setDefault(TimeZone.getTimeZone(myTempTimeZone)); 
TimeZone.setDefault(timeZone); 

這是不夠的。 我們還需要更改時區,在DateTimeZone如下:

@Before 
public void setUp() throws Exception { 
    timeZone = TimeZone.getDefault(); 
    dateTimeZone = DateTimeZone.getDefault(); 
} 

@After 
public void tearDown() throws Exception { 
    TimeZone.setDefault(timeZone); 
    DateTimeZone.setDefault(dateTimeZone); 
} 

@Test 
public void myTest() throws Exception { 
    TimeZone.setDefault(TimeZone.getTimeZone(myTempTimeZone)); 
    DateTimeZone.setDefault(DateTimeZone.forID(myTempTimeZone)); 
    //TODO 
    // my code with an specific timezone conserving time 
} 

希望它可以幫助到別人爲好。