项目报错信息:

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)