前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SimpleDateFormat无法处理纳秒

SimpleDateFormat无法处理纳秒

原创
作者头像
查拉图斯特拉说
发布2024-02-07 20:59:51
1200
发布2024-02-07 20:59:51
举报
文章被收录于专栏:后端架构后端架构

前言

这一节主要是介绍进行一个日期函数处理所踩坑的一个记录。这个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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 代码示例
  • 支持毫秒
  • 解决
  • 总结
  • 引用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档