我试图解析datetime字符串并创建Joda DateTime对象。
我的数据来自存储日期时间字符串而不指定时区/偏移量的旧数据库。尽管没有存储日期时间字符串的时区/偏移量,但这是旧系统的业务规则,即所有日期时间都存储在东部时间中。不幸的是,我无权更新旧版数据库存储日期时间字符串的方式。
因此,我使用JODA的“美国/东部”时区解析日期时间字符串。
当dateTime字符串落在启用夏令时时“消失”的小时之内,则此方法将引发llegalInstance异常。
我创建了以下示例代码来演示此行为并展示我建议的解决方法。
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。因为它落在DST的2015年第一个小时之内。第二个时间戳的偏移量是-05:00,因为它不在DST范围内。
这样做是安全的:
DateTime dateTime = DateTime.parse(dateTimeString, A_FORMATTER_WITH_TIME_ZONE_A); dateTime = dateTime.withZone(TIME_ZONE_B);
我已经用日期时间字符串和时区的几种不同组合测试了此代码(到目前为止,它适用于所有测试用例),但是我想知道是否有更多Joda经验的人会发现这种方法有什么错误/危险。
还是可以选择:是否有更好的方法来处理Joda的时区偏移过渡?