将字符串转为时间晚了5天,避坑指南

简介: 将字符串转为时间晚了5天,避坑指南

1. 问题的发现

  1. 使用如下方法进行转换,发现日期转换前后居然相差了5天!!!
System.out.println(transferString2Date("1000-01-01").toInstant().atZone(ZoneId.systemDefault()).toLocalDate());


2.运行结果为:

1000-01-06


3.其中,transferString2Date方法如下

public static Date transferString2Date(String s) {
  Date date = new Date();
  try {
      date = new SimpleDateFormat("yyyy-MM-dd").parse(s);
  } catch (ParseException e) {
      e.printStackTrace();
  }
  return date;
}
  1. 这种情况发生在项目中是没有任何报错的,不会抛出任何异常,只能在人工发现数据异常后去慢慢排查,实在是太可恶了!!!那么为什么会出现这种错误呢?


2. 问题的排查

  1. 首先排查transferString2Date方法的问题,发现该方法的输出为
Mon Jan 01 00:00:00 CST 1000
  1. 因此这个方法没有问题。
  2. 然后排查toInstant方法,点进该方法
/**
 * Converts this {@code Date} object to an {@code Instant}.
 * <p>
 * The conversion creates an {@code Instant} that represents the same
 * point on the time-line as this {@code Date}.
 *
 * @return an instant representing the same point on the time-line as
 *  this {@code Date} object
 * @since 1.8
 */
public Instant toInstant() {
  return Instant.ofEpochMilli(getTime());
}


3.继续点进getTime方法,问题来了

/**
 * Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT
 * represented by this <tt>Date</tt> object.
 *
 * @return  the number of milliseconds since January 1, 1970, 00:00:00 GMT
 *          represented by this date.
 */
public long getTime() {
    return getTimeImpl();
}


该方法返回一个从1970-01-01 00:00:00起到该时间的毫秒数!!!而我传入的时间是要早于1970-01-01 00:00:00的,因此会产生问题。

3. 问题的解决

1.已经发现了问题的所在,那么要如何解决这一问题呢?

2.在实际开发中,很少会遇到1970-01-01 00:00:00以前的时间。在我的这次开发任务中,业务方提供的数据中使用了1000-01-01来标识该字段时间是一个无效时间。因此对于这类场景的最优解其实是,使用与日期无关的类型,比如notUpdated而不是1000-01-01来表示无效时间。


目录
相关文章
|
Java 云计算
阿里云国际站代理商:Java计算当前时间处于某段时间内的第几周、第几个月
@luotuoemo飞机@TG阿里云国际站代理商:Java计算当前时间处于某段时间内的第几周、第几个月,以上就是使用Java代码计算当前时间处于某段时间内的第几周和第几个月的全部内容。通过该篇文章,我们可以了解到如何使用Java的Calendar类以及日期函数来计算时间段内的周数和月数,掌握相应的计算方法和实践技巧。在开发过程中,合理运用这些方法,可以方便地获取时间相关的信息,满足业务需求,提高开发效率。希望本文能对读者在使用阿里云国际站代理商开发Java应用时计算时间段的周数和月数提供一些帮助与启示。
|
存储 前端开发 数据库
闲谈时间
闲谈时间
68 0
|
关系型数据库 MySQL Java
还在为时区问题发愁?获取的时间与中国时间差八小时怎么办?史上最全的解决方案总结
还在为时区问题发愁?获取的时间与中国时间差八小时怎么办?史上最全的解决方案总结
面试题:判断两个时间是否在同一周
这个题是在面试的时候遇到的,还遇到了2次,和大家分享一下自己的解题思路 感觉像是一个业务上的题,可能面试官刚做过类似的需求,就直接拿出来问了
|
监控 Java 索引
昨天面试居然聊了半个多小时的异常处理
大风吹去了往日的雾霾,阳光透过窗户照进来,透过窗户可以看到远处的山脉与蓝天相接,这可比我那永远见不到阳光的出租屋好多了。渐渐走进的脚步声打断了我的思绪,一位小姐姐坐在了面前,甜甜的香水味立刻钻进了我的鼻孔。 小姐姐微笑地说:”您好,我是今天的面试官,那么开始吧?“ 我收起直勾勾的眼睛,说:“好的。” 小姐姐说:“在Java的异常处理中有两大组成要素:抛出异常和捕获异常。那么抛出异常可以分为哪两种呢?” 我立刻回答到:
151 0
个人时间都干啥
我说的个人时间,是自己独处的时间,独自的时间都应该干啥,身边很多朋友不是在刷剧就是在无聊,其实不是说不可以刷剧,也不是说不可无聊,而是说,你的个人时间不应该全都是处于这种状态,或者说,你个人的大部分时间都应该处于投资自己和让自己长身价的状态 我觉得这也是一投资理财,但是唯一不同的是,这投资的是自己,而且是一个仿佛看不到收益的投资,但是这是最明智的投资,因为这个投资会随着时间的增长它的收益率大到让你想不到,可是很多人投资只喜欢短线投机,没有耐心做长线,那就很可惜了。
1025 0
一周总结(十八)
基本上都是程序上的事情,周围的事情记得很少。 读Shiro源码,Shiro的Session管理,Shiro的多Realm多登陆页面。 读Mybatis源码,关于Cache的控制,Exector部分 学习了React的语法,React Nactive做了小Demo 周末看了加勒比海盗2,3.看了死侍。