我从数据库获取UTC时间戳,我正在设置为JodaTime DateTime
实例
DateTime dt = new DateTime(timestamp.getTime());
它将时间完美地说成10:00 AM
,但使用当地时区。例如,我在IST时区,距离UTC
我已经尝试过很多改变时区的东西,但是通过使用+5:30差异来改变从10:00 AM
到其他东西的时间
有什么方法可以在不影响当前时间的情况下更改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
答案 0 :(得分:45)
您可以使用课程LocalDateTime
LocalDateTime dt = new LocalDateTime(t.getTime());
并将LocalDateTime
转换为DateTime
DateTime dt = new LocalDateTime(timestamp.getTime()).toDateTime(DateTimeZone.UTC);
Joda DateTime
任何时候都会毫不犹豫地将“1970年以来的当前时区”视为“毫秒”。因此,当您创建DateTime
实例时,会使用当前时区创建它。
答案 1 :(得分:45)
您可以使用withZoneRetainFields()
DateTime
方法更改时区而不更改日期中的数字。
答案 2 :(得分: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();
}
答案 3 :(得分:1)
我遇到了同样的问题。在阅读了这组有用的答案,并给出了我的特殊需求和可用对象之后,我通过使用另一个DateTime构造函数来解决它:
new DateTime("2012-04-23T18:25:46.511Z", DateTimeZone.UTC)
答案 4 :(得分:0)
另外,我有另一种对我很有帮助的方法。 我想让我的工作流线程临时更改为特定时区(节省时间),然后当我的代码完成时,我再次设置原始时区。 事实证明,当您使用joda库时,请执行以下操作:
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
}
希望它对其他人也有帮助。
答案 5 :(得分:0)
给出的答案均未真正解释问题。真正的问题是最初的假设是不正确的。来自数据库的时间戳是使用本地JVM时区Asia/Kolkata
而非UTC创建的。这是JDBC的默认行为,这就是为什么仍然建议将JVM时区设置为UTC的原因。
如果数据库中的时间戳实际上是:
2013-09-25 11:27:34 AM UTC
或采用ISO-8601格式:
2013-09-25T11:27:34Z // The trailing 'Z' means UTC
然后使用new DateTime(timestamp, DateTimeZone.UTC)
构造函数可以正常工作。亲自看看:
Timestamp timestamp = new Timestamp(1380108454000L);
DateTime dt = new DateTime(timestamp.getTime(), DateTimeZone.UTC);
System.out.println(dt); // => 2013-09-25T11:27:34.000Z
如果您想知道我如何获得1380108454000L
,我只是使用了Joda解析类:
ISODateTimeFormat.dateTimeParser().parseMillis("2013-09-25T11:27:34Z")
或者有一些在线的网站,您可以在其中输入日期,时间和时区,并返回以毫秒为单位的纪元值,反之亦然。有时可以作为健全性检查。
// https://www.epochconverter.com
Input: 1380108454000 Click: "Timestamp to Human Date"
Assuming that this timestamp is in milliseconds:
GMT: Wednesday, September 25, 2013 11:27:34 AM
此外,请记住java.sql.Timestamp
类与Joda / Java 8+ Instant
类大致相关。有时,在同等的类之间进行转换以发现像这样的错误会更容易。