项目报错信息:
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)