当前位置:  开发笔记 > 编程语言 > 正文

使用Joda处理时区偏移过渡和夏令时

如何解决《使用Joda处理时区偏移过渡和夏令时》经验,为你挑选了0个好方法。

我试图解析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的时区偏移过渡?

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有