SimpleDateFormat类时间转换BUG

来源:互联网 发布:淘宝邮箱注册页面 编辑:程序博客网 时间:2024/05/29 16:10

今天在群里碰到一个有意思的问题

说 19910414000000字符串在经过SimpleDateFormat转换的时候会出现一小时精度误差。

当时我第一反应是不是时区出现问题。

排查发现不是。用严格模式来执行转换会抛出异常。

测试发现以下日期会出现精度异常时间位置全部为00

测试时间端1910+300年

1940 06-03 00:00:00 1940 06-03 01:00:00
1941 03-16 00:00:00 1941 03-16 01:00:00
1986 05-04 00:00:00 1986 05-04 01:00:00
1987 04-12 00:00:00 1987 04-12 01:00:00
1988 04-10 00:00:00 1988 04-10 01:00:00
1989 04-16 00:00:00 1989 04-16 01:00:00
1990 04-15 00:00:00 1990 04-15 01:00:00
1991 04-14 00:00:00 1991 04-14 01:00:00

不太清楚为什么,或许是算法问题吧,欢迎讨论

代码片段来自于Just Do Java群群主,

private static final Set<Integer> bigMonthSet = new HashSet<>();    private static final Set<Integer> smallMonthSet = new HashSet<>();    static {        bigMonthSet.addAll(Arrays.asList(1, 3, 5, 7, 8, 10, 12));        smallMonthSet.addAll(Arrays.asList(4, 6, 9, 11));    }    public static boolean isLeapYear(int year) {        return year % 400 == 0 || (year % 100 != 0 && year % 4 == 0);    }    public static int getMaxDays(int year, int month) {        if(bigMonthSet.contains(month)) {            return 31;        }        if(smallMonthSet.contains(month)) {            return 30;        }        if(isLeapYear(year)) {            return 29;        }        return 28;    }    public static void main(String[] args) throws ParseException {        SimpleDateFormat sdf = new SimpleDateFormat("yyyy MM-dd HH:mm:ss");        int startYear = 1910;        for (int i = 0; i < 3000; i++) {            int year = startYear + i;            for (int j = 0; j < 12; j++) {                int month = j + 1;                int maxDays  = getMaxDays(year, month);                for (int k = 0; k < maxDays; k++) {                    int day = k + 1;                    String dateString = "" + year + " " + (month < 10 ? "0" + month : month) + "-" +                        (day < 10 ? "0" + day : day) + " 00:00:00";                    if(!dateString . equals(sdf.format(sdf.parse(dateString)))) {                        System.out.println(dateString + "\t\t" + sdf.format(sdf.parse(dateString)));                    }                }            }        }    }


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 善心汇崩盘了钱怎么办 日本销签忘记了怎么办 手腕的筋拉伤了怎么办 膝盖韧带拉伤怎么办恢复快 手写发票写错了怎么办 发票电话写错了怎么办 京东不可7天退货怎么办 代销有人下单了怎么办 茜子饰品坏了怎么办 唇釉有点干了怎么办 如果微商被骗了怎么办 微信照片过期了怎么办 异地恋没话说了怎么办 请事假公司不批怎么办 请病假领导不批怎么办 农民被当官的整怎么办 领英人脉圈以外怎么办 收到领英的短信怎么办 狗半夜叫个不停怎么办 如果被鬼上身了怎么办 支付宝借钱不还怎么办 鞋子里鞋垫老跑怎么办 鞋垫在鞋里老串怎么办 网贷已经借不到怎么办 骨龄比实际年龄大怎么办 小孩崴脚了肿了怎么办 报到证过期2年多怎么办 报到证过了期限怎么办 报到证超过两年怎么办 报到证过期4年了怎么办 学校没发报到证怎么办 未报到证过期了怎么办 专升本的报到证怎么办 蓝色报到证丢了怎么办 报到证用过了怎么办 大学报到证丢了怎么办 qq好被冻结了怎么办啊 qq突然被冻结了怎么办 扣扣密码被冻结怎么办 蠕动泵不抽水了怎么办 失眠多梦压力大怎么办