我正在尝试解析日期时间字符串并创建Joda DateTime对象。
我的数据来自遗留数据库,存储日期时间字符串时没有指定时区/偏移量。虽然日期时间字符串的时区/偏移量未存储,但是遗留系统的业务规则要求所有日期时间都以东部时间存储。不幸的是,我没有权限更新遗留数据库存储日期时间字符串的方式。
因此,我使用JODA的“US / Eastern”时区解析日期时间字符串。
当夏令时开启时,如果dateTime字符串落在“消失”的那个小时内,这种方法会抛出illegalInstance异常。
我创建了以下示例代码来演示这种行为并展示我的提议的解决方法。
public class FooBar {
public static final DateTimeZone EST = DateTimeZone.forID("EST");
public static final DateTimeZone EASTERN = DateTimeZone.forID("US/Eastern");
public static final DateTimeFormatter EST_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS").withZone(EST);
public static final DateTimeFormatter EASTERN_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS").withZone(EASTERN);
public static void main(String[] args) {
final String[] listOfDateTimeStrings = {"2014-03-09 02:00:00.000", "2014-03-08 02:00:00.000"};
System.out.println(" *********** 1st attempt *********** ");
for (String dateTimeString: listOfDateTimeStrings){
try{
final DateTime dateTime = DateTime.parse(dateTimeString, EASTERN_FORMATTER);
System.out.println(dateTime);
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
System.out.println(" *********** 2nd attempt *********** ");
for (String dateTimeString: listOfDateTimeStrings){
try{
final DateTime dateTime = DateTime.parse(dateTimeString, EST_FORMATTER);
System.out.println(dateTime);
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
System.out.println(" *********** 3rd attempt *********** ");
for (String dateTimeString: listOfDateTimeStrings){
try{
DateTime dateTime = DateTime.parse(dateTimeString, EST_FORMATTER);
dateTime = dateTime.withZone(EASTERN);
System.out.println(dateTime);
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
产生的输出:
*********** 第一次尝试 *********** 无法解析“2014-03-09 02:00:00.000”:由于时区偏移转换(美国/纽约),因此时间不合法 2014-03-08T02:00:00.000-05:00 *********** 第二次尝试 *********** 2014-03-09T02:00:00.000-05:00 2014-03-08T02:00:00.000-05:00 *********** 第三次尝试 *********** 2014-03-09T03:00:00.000-04:00 2014-03-08T02:00:00.000-05:00
在“第三次尝试”中,我得到了预期的结果:第一个日期时间具有-04:00的偏移量,因为它落在2015年夏令时的第一小时内。第二个时间戳具有-05:00的偏移量,因为它落在夏令时之外。
这样做是否安全:
DateTime dateTime = DateTime.parse(dateTimeString, A_FORMATTER_WITH_TIME_ZONE_A);
dateTime = dateTime.withZone(TIME_ZONE_B);
我已经用几种不同的日期时间字符串和时区测试了这段代码(到目前为止,它对所有测试用例都有效),但我想知道有没有更多Joda经验的人能够看出这种方法是否存在任何错误/危险。
或者说:有没有更好的方法来处理使用Joda进行时区偏移转换?