将字符串转为时间晚了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来表示无效时间。


目录
相关文章
|
9月前
|
Java 云计算
阿里云国际站代理商:Java计算当前时间处于某段时间内的第几周、第几个月
@luotuoemo飞机@TG阿里云国际站代理商:Java计算当前时间处于某段时间内的第几周、第几个月,以上就是使用Java代码计算当前时间处于某段时间内的第几周和第几个月的全部内容。通过该篇文章,我们可以了解到如何使用Java的Calendar类以及日期函数来计算时间段内的周数和月数,掌握相应的计算方法和实践技巧。在开发过程中,合理运用这些方法,可以方便地获取时间相关的信息,满足业务需求,提高开发效率。希望本文能对读者在使用阿里云国际站代理商开发Java应用时计算时间段的周数和月数提供一些帮助与启示。
|
存储 前端开发 数据库
闲谈时间
闲谈时间
57 0
你花了两天时间,就给老子写了两行代码?!
你花了两天时间,就给老子写了两行代码?!
69 0
|
编解码 算法 搜索推荐
小傻蛋来做一周学习总结吧~~~
小傻蛋来做一周学习总结吧~~~
小傻蛋来做一周学习总结吧~~~
|
关系型数据库 MySQL Java
还在为时区问题发愁?获取的时间与中国时间差八小时怎么办?史上最全的解决方案总结
还在为时区问题发愁?获取的时间与中国时间差八小时怎么办?史上最全的解决方案总结
面试题:判断两个时间是否在同一周
这个题是在面试的时候遇到的,还遇到了2次,和大家分享一下自己的解题思路 感觉像是一个业务上的题,可能面试官刚做过类似的需求,就直接拿出来问了
L1-5 VV的烦恼 (15 分)
VV今天去图书馆学习,发现电脑没充满电,电量只剩下n,而她有m1个低计算量程序需要运行,m2个高计算量程序需要运行 现假设电脑在运行低计算量程序的情况下消耗电量p1每分钟,运行高计算量程序的情况下消耗电量p2每分钟,运行不同程序之间没有时间间隔。 请问VV能把所有程序运行完吗?
117 0
|
监控 Java 索引
昨天面试居然聊了半个多小时的异常处理
大风吹去了往日的雾霾,阳光透过窗户照进来,透过窗户可以看到远处的山脉与蓝天相接,这可比我那永远见不到阳光的出租屋好多了。渐渐走进的脚步声打断了我的思绪,一位小姐姐坐在了面前,甜甜的香水味立刻钻进了我的鼻孔。 小姐姐微笑地说:”您好,我是今天的面试官,那么开始吧?“ 我收起直勾勾的眼睛,说:“好的。” 小姐姐说:“在Java的异常处理中有两大组成要素:抛出异常和捕获异常。那么抛出异常可以分为哪两种呢?” 我立刻回答到:
137 0
|
存储 算法 Java
30岁开始学编程晚吗?
30岁开始学编程晚吗?
177 0