在约达时间如何转换时区而不改变时间

我正在从数据库获取UTC时间戳,这是我设置到JodaTime DateTime实例

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

它存储的时间完全说10:00 AM但与当地时区。 例如,我在IST时区,从UTC到+5:30

我已经尝试了很多改变时区的东西,但是每一件事情都会改变从10:00 AM到其他地方的时间,通过使用+5:30差异

有什么办法可以在不影响当前时间的情况下更改TimeZone?

编辑:如果我目前的时间是:

 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 

你可以使用LocalDateTime类

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

并将LocalDateTime转换为DateTime

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

Joda DateTime在任何时间处理像“ 当前时区1970年以来的毫秒”。 所以,当你创buildDateTime实例时,它是用当前时区创build的。

您可以使用DateTimewithZoneRetainFields()方法更改时区而不更改date中的数字。

如果您的时间戳是: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

打破它:这给你一个DateTime对应于你的时间戳,指定它在UTC:

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

2015-01-01T00:00:00.000Z

这给你一个date时间,但时间转换为当地时间:

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

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

以下是我如何做到这一点:

 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(); } 

另外我有另一种方法对我非常有帮助。 我想让我的工作stream线程临时更改为特定的时区(节省时间),然后当我的代码完成后,我再次设置原始时区。 事实certificate,当你使用乔达图书馆,做:

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

这不够。 我们还需要更改DateTimeZone中的TimeZone,如下所示:

 @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 } 

希望这对其他人也有帮助。