关于java:如何将DateTime保存为包含TimeZone偏移的日期?

How to save DateTime as Date with TimeZone offset included?

我有一些日期时间,包括欧洲/维也纳时区(+0200)。它是通过以下方法获取的:

1
settlementService.getPendingPeriodStart()

用这样的绳子:

2012-06-01T00:00:00.000+02:00

现在我想将这个日期2012-06-01保存为java.util.date,所以我尝试了如下方法:

1
transactionDate = settlementService.getPendingPeriodStart().withTime(0, 0, 0, 0).toDate();

但结果是:

Thu May 31 22:00:00 UTC 2012

将日期时间结果保存为日期(包括时区偏移量)的最佳方法是什么,因此TransactionDate应该是2012-06-01。我可以修补格里高利日历,但这不是我喜欢的。这应该更容易些,不是吗?

顺便说一下(如果不清楚的话)。本地系统在UTC上运行。这就是为什么结果是2012年5月31日星期四22:00:00。


我想我找到了解决办法。(如果你知道更好的解决方案,请告诉我)

1
2
3
4
5
6
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

DateTime dateTimeWithTimeZone = new DateTime(DateTimeZone.forID("Europe/Vienna")).withDate(2012, 06, 01).withTime(0, 0, 0, 0);      
Date dateWithTimeZoneIncluded = dateTimeWithTimeZone.toLocalDate().toDate();

System.out.println(dateFormat.format(dateWithTimeZoneIncluded));

结果与预期一致,为2012-06-01。


用户的日期和时区是两个不同的东西。一个是日期,另一个是首选项或表示参数。

不要试图将它们存储在同一个字段中。

考虑到甚至不可能有效地将它们存储在一起(而不会丢失精度),因为只有在指定日期为UTC日期的情况下,才能将日期存储在long中。

您可以将时区另存为偏移量(由于情况非常小,经常建议将分钟数保留在此偏移量中([hh]:[mm])。