2013-09-25 62 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 
} 

希望它可以帮助到别人为好。