SimpleDateFormat无法处理纳秒

2024-02-07 20:59:51 浏览数 (2)

前言

这一节主要是介绍进行一个日期函数处理所踩坑的一个记录。这个SimpleDateFormat类大家都很熟悉,也是之前非常喜欢用的时间处理累类。平常可能会处理到的就是秒级别或者三位的毫秒级别。很少有接触到纳秒级别,因为用成了习惯,所以今天突然碰到一个使用纳秒的数据。然后就产生了一系列的异常。

代码示例

下面这个例子主要是介绍日期处理的类。

代码语言:javascript复制
    public static void main(String[] args) {
        String dateTimeString = "2024-02-07 13:58:08.424527802  0800";
//        dateTimeString = "2024-02-07 13:58:08.424  0800";
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSSSS Z");
        try {
            Date date = dateFormat.parse(dateTimeString);
            long timestamp = date.getTime();
            System.out.println("默认格式:"   dateTimeString);
            System.out.println("日期时间:"   dateFormat.format(date));
            System.out.println("时间戳为:"   timestamp);
        } catch (Exception e) {
            System.out.println("日期时间解析失败:"   e.getMessage());
        }
    }

这是上述代码收藏的结果,显然两次的时间出现了不一致的情况。

代码语言:javascript复制
默认格式:2024-02-07 13:58:08.424527802  0800
日期时间:2024-02-12 11:53:35.000000802  0800
时间戳为:1707710015802

支持毫秒

将纳秒转换为毫秒后,代码能够正确识别和处理各种毫秒输入,但对之前输入的六位数微秒测试却错误地显示了错误结果。

时间格式yyyy-MM-dd HH:mm:ss.SSS Z

代码语言:javascript复制
默认格式:2024-02-07 13:58:08.424  0800
日期时间:2024-02-07 13:58:08.424  0800
时间戳为:1707285488424

解决

随后,我查找了一些相关的博客来进一步了解如何解决这个问题。我发现,使用JAVA 8的一些新的时间管理DateTimeFormatter类,可以更完美地解决这个问题。这个类可以对时间进行更精确的格式化,这样就可以确保时间的准确性。果然,我还是应该跟着jDK的版本编码,这样才能保证代码的可维护性和可读性。

使用DateTimeFormatter类之后

代码语言:javascript复制
        public static void main(String[] args) {
            String dateTimeString = "2024-02-07 13:58:08.424527802  0800";
            dateTimeString = "2024-02-07 13:58:08.424527802  0800";
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS Z");
            LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);
            System.out.println("格式化后的日期时间:"   dateTime);
            ZoneId zoneId = ZoneId.systemDefault();  // 获取系统默认时区,您也可以指定其他时区
            ZonedDateTime zonedDateTime = dateTime.atZone(zoneId);
            long timestamp = zonedDateTime.toInstant().toEpochMilli();
            System.out.println("格式化后的time:"   timestamp);
        }

数据开始变得正确起来。

代码语言:javascript复制
格式化后的日期时间:2024-02-07T13:58:08.424527802
格式化后的time:1707285488424

总结

近期我在处理日期时间数据时,遇到了一个很令人费解的问题。我发现我平时经常使用的一个日期处理类,它的精度居然不支持纳秒级别,这让我感到非常困惑,因为我之前完全没有意识到这个问题。因此,我觉得非常有必要将这个踩坑记录下来,以便将来避免类似的问题。

引用

https://blog.csdn.net/xiaolegeaizy/article/details/124877672

最后

点赞关注评论一键三连,每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

0 人点赞