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

Posted j-liu3323

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
 
 
 

 









以上是关于Illegal instant due to time zone offset transition (Asia/Shanghai)_夏令时问题的主要内容,如果未能解决你的问题,请参考以下文章

Dubbo-Fail to decode request due to: RpcInvocation

iOS 崩溃:__CRASHING_DUE_TO_PRIVACY_VIOLATION__

Account locked due to 25 failed logins

Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

Ship detained due to incorrect liferaft painter secured