• Illegal instant due to time zone offset transition (Asia/Shanghai)_夏令时问题


    项目报错信息:

    Connot parse "1991-04-14",illegal instant due to time zone offset transition(Asia/Shanghai)

    在网上查了一下说是由于夏令时问题引起了,那么什么是夏令时呢?

    夏时制,夏时令(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。我国1986年4月中央颁布了相关政策, 1992年起,夏令时暂停实行。
     
    夏令时开始:每年从四月中旬第一个星期日的凌晨2时整(北京时间),将时钟拨快一小时,即将表针由2时拨至3时;
    夏令时结束:直到九月中旬第一个星期日的凌晨2时整(北京夏令时),再将时钟拨回一小时,即将表针由2时拨至1时。
             
    具体时段:【1986-05-04(第一年特殊化)至1986-09-14, 1987-04-12至1987-09-13, 1988-04-10至1988-09-11, 1989-04-16至1989-09-17, 1990-04-15至1990-09-16, 1991-04-14至1991-09-15】。
     
    夏令时对编程的影响: 有一些日期转换的类(org.joda.time包下的类)一碰到夏令时开始日期(1986-05-04,1987-04-12 ,1988-04-10,1989-04-16,1990-04-15,1991-04-14)就会报错

    import org.joda.time.LocalDate;
    import org.joda.time.format.DateTimeFormat;
    import org.joda.time.format.DateTimeFormatter;

    public static Date getBirthdayByIdCardNo(String IDCardNo) {
            Date birthday = null;
            if (StringUtils.isNotBlank(IDCardNo)) {
                int length = IDCardNo.length();
                if (length == 15 || length == 18) {
                    String strBirthday = null;
                    if (length == 18) {
                        //7—14位出生年月日
                        strBirthday = IDCardNo.substring(6, 14);
                    } else {
                        //7-12位出生年月日,比如670401代表1967年4月1日
                        strBirthday = StringUtils.leftPad(IDCardNo.substring(6, 12), 8, "19");
                    }
    //DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyyMMdd");会报错
    //birthday = LocalDate.parse(strBirthday, formatter).toDate();会报错

              //SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");//所有的日期转换都要经过Calendar类,所以是线程不安全的。

                    //date = df.parse("2008-08-08");

              birthday = DateUtils.parse(strBirthday, "yyyyMMdd");

                }

            }
            return birthday;
        }
    import java.util.Date;
    import java.util.regex.Pattern;
    
    import org.joda.time.DateTime;
    public class DateUtils {
    
        public static final Pattern DATE_PATTERN = Pattern.compile("^\d{4}-\d{1,2}-\d{1,2}$");
    
        public static Date parse(String time, String format) {
            return DateTimeUtils.toDate(DateTimeUtils.parse(time, format));
        }
    }
    
    
    import java.util.Date;
    
    import org.apache.commons.lang3.StringUtils;
    import org.joda.time.DateTime;
    import org.joda.time.format.DateTimeFormat;
    
    public class DateTimeUtils {
        
        public static Date toDate(DateTime dateTime){
            return dateTime == null ? null : dateTime.toDate();
        }
    
         public static DateTime parse(String time, String format) {
            if(StringUtils.isBlank(time)){
                return null;
            }
            return DateTime.parse(time,       
                                             DateTimeFormat.forPattern(format));
        }
            
    }
    
        
    
    
    


     
    解决方案:
     在启动类*Applation.java 中加入
     System.setProperty("user.timezone", "Etc/GMT-8");
     
    友情链接:https://my.oschina.net/u/3871554/blog/1859717(讲述为何使用joda 包而非SimpleDateFormat)
     
     
     
  • 相关阅读:
    hdu 2544 Dijstra模板题
    hdu 1002 prime 模板
    POJ_2653_Pick-up sticks_判断线段相交
    POJ_1556_The Doors_判断线段相交+最短路
    POJ_1269_Intersecting Lines_求直线交点
    POJ_3304_Segments_线段判断是否相交
    POJ_2318_TOYS&&POJ_2398_Toy Storage_二分+判断直线和点的位置关系
    ZOJ_2314_Reactor Cooling_有上下界可行流模板
    LuoguP4234_最小差值生成树_LCT
    BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图
  • 原文地址:https://www.cnblogs.com/j-liu3323/p/9809781.html
Copyright © 2020-2023  润新知