在约达时间如何转换时区而不改变时间
我正在从数据库获取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的。
您可以使用DateTime
的withZoneRetainFields()
方法更改时区而不更改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 }
希望这对其他人也有帮助。