1、问题报错
2、原因
由于没过的夏令营导致的报错。 夏令时: 由于美国有夏令时,CST非夏令时对应 UTC-06:00,夏令时对应 UTC-05:00 。 美国的夏令时,从每年3月第2个星期天凌晨开始,到每年11月第1个星期天凌晨结束。 以2020年为例: 夏令时开始时间调整前:2020年03月08日星期日 02:00:00,时间向前拨一小时. 调整后:2020年03月08日星期日 03:00:00
夏令时结束时间调整前:2020年11月01日星期日 02:00:00,时间往回拨一小时. 调整后:2020年11月01日星期日 01:00:00
这意味这:CST没有2020-03-08 02:00:00~2020-03-08 03:00:00 这个区间的时间。会有两个 2020-11-01 01:00:00~2020-11-01 02:00:00区间的时间。
例:
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("CST"), Locale.US);
calendar.setLenient(false);
calendar.set(2020, 2, 8, 1, 2, 0);
Date s = new Date(calendar.getTimeInMillis());
SimpleDateFormat f1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(f1.format(s));
例:
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("CST"), Locale.US);
calendar.setLenient(false);
calendar.set(2020, 2, 8, 3, 2, 0);
Date s = new Date(calendar.getTimeInMillis());
SimpleDateFormat f1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(f1.format(s));
例:
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("CST"), Locale.US);
calendar.setLenient(false);
calendar.set(2020, 2, 8, 2, 2, 0);
Date s = new Date(calendar.getTimeInMillis());
SimpleDateFormat f1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(f1.format(s));
3、解决方案
- mysql-connector-java.jar版本6.x、8.x降级为5.1.x
- 对于高版本jdbc,连接串强制指定时区参数:serverTimezone=GMT%2B8(一般采用这种方式)
- 对于高版本jdbc,mysql数据库强制修改time_zone为“+8:00”,而非“SYSTEM
|