时区至关重要
不要忽略时区或偏移量,如 cmets 中所述。
忽略日期时间的时区就像忽略温度读数的 C/F(摄氏度/华氏度)或忽略文本的字符集编码。你会误解你的数据。
时区解析
在解析期间指定时区可以在 Joda-Time 中产生两种不同的效果。仔细考虑一下,您会发现这是合乎逻辑的,并且做的是正确的事情。
解析后
如果您在解析输入包含偏移量或时区的格式化程序上指定时区,那么 Joda-Time 会在解析过程中注意包含的偏移量。 之后确定日期时间(它落在宇宙时间线上的位置,定义为自 1970 年初以来在 UTC 时区的毫秒数,即无时区),然后您指定时区分配给 DateTime 对象。在这种情况下,通过指定的时区不会影响解析。指定的时区会影响该日期时间值的字符串 representations 的生成。
解析期间
另一方面,如果您在解析输入缺少任何偏移量或时区信息的格式化程序上指定时间,那么 Joda-Time 会使用您指定的时区 /em> 输入字符串的解析。
示例代码,Joda-Time
这是使用Joda-Time 2.3 的示例代码。首先是正确的方法,在解析字符串时使用偏移量。其次是错误的方式,忽略了偏移量。请注意不同的结果、不同的日期时间值,甚至可能不同的日期(取决于用于创建字符串表示的时区)。
带偏移
String input = "2014-08-08+02:00";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "yyyy-MM-ddZ" ).withZone( DateTimeZone.UTC );
DateTime dateTimeUsingOffset = formatter.parseDateTime( input ); // Offset used to determine date-time during parsing. After parsing the UTC time zone is assigned.
无偏移
String inputTruncatedOffset = input.substring( 0, 10 );
DateTime dateTimeIgnoringOffset = new DateTime( inputTruncatedOffset, DateTimeZone.UTC ); // In contrast to above, the UTC time zone is used *during* parsing to determine date-time as the input string contained no hint about offset or time zone.
转储到控制台。
System.out.println( "input: " + input );
System.out.println( "dateTimeUsingOffset: " + dateTimeUsingOffset );
System.out.println( "inputTruncatedOffset: " + inputTruncatedOffset );
System.out.println( "dateTimeIgnoringOffset: " + dateTimeIgnoringOffset );
运行时。
input: 2014-08-08+02:00
dateTimeUsingOffset: 2014-08-07T22:00:00.000Z
inputTruncatedOffset: 2014-08-08
dateTimeIgnoringOffset: 2014-08-08T00:00:00.000Z