为什么转换为UTC的“12:00”变为“11:00”?

时间:2011-10-23 18:14:54

标签: java jodatime

我认为2011-10-23 12:00:00将与UTC保持一致,Converted date 2011-10-23 17:00:00

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dt = formatter.parse("2011-10-23 12:00:00");
LocalDateTime ldt = new DateTime(dt).withZone(DateTimeZone.UTC).toLocalDateTime();
LOGGER.warn("Original date: " + ldt.toDateTime().toDate().toString());
DateTime cvtldt = ldt.toDateTime(DateTimeZone.forID("-05:00"));
LOGGER.warn("Converted date: " + cvtldt.toLocalDateTime().toDateTime().toDate().toString());

我不明白为什么输出减去一个小时?

Original date: Sun Oct 23 11:00:00 BST 2011
Converted date: Sun Oct 23 11:00:00 BST 2011    

2 个答案:

答案 0 :(得分:6)

您正在使用Date.toString() 始终使用本地时区。看看你的字符串如何包含“BST”?

理想情况下,尽可能多地坚持只是 Joda Time:

  • 使用Joda Time格式化程序解析
  • 除非您需要
  • ,否则请勿转换回Date
  • 如果可能可以,请使用Date.toString();你无法控制它的格式。

目前尚不清楚你真正想要实现的目标,但你几乎肯定不想做这么多次转换。例如,您在再次调用toLocalDateTime()之后再调用toDateTime() - 这意味着您在之前的转换中仔细指定了UTC之后使用系统默认时区...

您的代码包含以下转换(按此顺序):

  • String to Date
  • 日期到日期时间
  • DateTime to DateTime(UTC)
  • DateTime to LocalDateTime(*)
  • LocalDateTime to DateTime
  • DateTime to Date
  • 日期到字符串
  • (从*处的结果)LocalDateTime到DateTime
  • DateTime to LocalDateTime
  • LocalDateTime to DateTime
  • DateTime to Date
  • 日期到字符串

您认为所有转换的必要性和正确指定的可能性是什么? ;)

答案 1 :(得分:0)

原因已更改,因为转换为UTC是针对主机时区完成的,因此应该更改。

转换已经改变了,实际上这是访问方法的问题。 您正在获得基准时间,修改器存储在其他字段中。

尝试进入调试模式,转换后会看到cvtldt to toString with modifier。

此致 Grzesiek