关于long型数据转换的一个大坑

情境再现:需要获取并显示一个用户的年龄,eg:26岁。后台返回的数据含有User实体类,该类中含有long型字段的birthday(毫秒数)。

我的思路:获取系统的当前时间(毫秒数),减去用户的生日(毫秒数),得到的是用户已经活了多长时间(毫秒数),然后除以每一年的毫秒数,即可得到用户的年龄,代码如下:

long haveLiveMs = System.currentTimeMillis() - data.getBirthday(); long haveLiveYear = haveLiveMs/(365*24*60*60*1000);

但是得到的结果却是不正确的,为587,明显错误。看了又看,想了又想:没错啊,这逻辑没有错误啊,但为什么就是结果不正确呢?

它山之石:同事让通过后台给的long型数据生成Date变量,然后通过SimpleDateFormat类转换出出生年份,当前年份减去转换出的年份即为用户年龄,代码如下:

Date date = new Date(data.getBirthday()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); String s = sdf.format(date);

得到的结果是正确的。这就说明后台返回的数据是正确的,但是“我的思路”到底错在哪里了呢?

柳暗花明:当初,我误认为(365*24*60*60*1000)的结果会是long型,但是Java对于整形数据而言,都默认为int类型的,(365*24*60*60*1000)得到的值明显会大于Integer.Max_Value,存储的时候必然产生截断,导致参与除法的除数的数值发生变化,进而产生错误的结果。

因此,正确的做法是显示声明(365*24*60*60*1000)的类型为long型,eg:
long haveLiveYear = haveLiveMs/(365*24*60*60*1000L);
这样就得到了正确的结果。

正确的正确:就同事的方法而言,我的思路明显没有考虑到闰年天数变化所带来的误差,因此应采取同事的方法,及时自己的思路是正确的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 开发中,难免要对一些日期数据进行处理,下面一些方法仅供参考 一、常用日期常量 1.一天的时间 毫秒数表示 publ...
    张鱼的故事阅读 6,828评论 3 3
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,884评论 6 13
  • 第05天API 今日内容介绍 ·Object类& System类 ·日期相关类 ·包装类&正则表达式 ·Date对...
    chcvn阅读 3,199评论 0 1
  • 午夜两点 忍不住去楼下 买了一杯咖啡 借着心理作用整理书架和你的回忆 我依赖咖啡 你却不喝 你喜欢小狗 我也表示恐...
    cool爱顺阅读 1,410评论 0 0
  • 分享一些基础淡斑办法。因为护肤因人而异!想到哪里写哪里的,有点乱,你们将就看 先要隔离,防晒。 一年四季都要用防晒...
    幼微阅读 3,579评论 1 5