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

zip*_*ppy 0 java jodatime

我认为2011-10-23 12:00:00将保持相同UTC,而且Converted date2011-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());
Run Code Online (Sandbox Code Playgroud)

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

Original date: Sun Oct 23 11:00:00 BST 2011
Converted date: Sun Oct 23 11:00:00 BST 2011    
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

你正在使用Date.toString()哪个总是使用本地时区.看看你的字符串是如何包含"BST"的?

理想的情况下,坚持约达时间尽可能多的时间,你可以:

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

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

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

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

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