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


目录
相关文章
|
4月前
|
JavaScript 小程序 前端开发
JS将时间戳转换为刚刚、N分钟前、今天几点几分、昨天几点几分等表示法
JS将时间戳转换为刚刚、N分钟前、今天几点几分、昨天几点几分等表示法
|
7月前
|
Cloud Native 算法 Go
面试准备的时间线:从一个月前到面试当天
面试准备的时间线:从一个月前到面试当天
38 0
|
10月前
|
存储 前端开发 数据库
闲谈时间
闲谈时间
47 0
|
安全 Java Linux
正确认识及掌握时间的用法
时间是一个相对地区而言的概念,因此有一个基准地区,就是本初子午线穿过的地区。了解世界时间相关的概念可以更好地协调全球人们的活动,便于跨越不同地区的时差。比如按照UTC时区划分算,洛杉矶和北京 之间的时间差异是16个小时, 但是一旦洛杉矶启用了夏令时两者之间的时间差异只有15个小时,神奇吗?
184 0
正确认识及掌握时间的用法
L1-5 VV的烦恼 (15 分)
VV今天去图书馆学习,发现电脑没充满电,电量只剩下n,而她有m1个低计算量程序需要运行,m2个高计算量程序需要运行 现假设电脑在运行低计算量程序的情况下消耗电量p1每分钟,运行高计算量程序的情况下消耗电量p2每分钟,运行不同程序之间没有时间间隔。 请问VV能把所有程序运行完吗?
102 0
面试题:判断两个时间是否在同一周
这个题是在面试的时候遇到的,还遇到了2次,和大家分享一下自己的解题思路 感觉像是一个业务上的题,可能面试官刚做过类似的需求,就直接拿出来问了
|
监控 网络协议 Dubbo
开工第一天,这个超时问题把我干趴下了!
开工第一天,这个超时问题把我干趴下了!
|
监控 Java 索引
昨天面试居然聊了半个多小时的异常处理
大风吹去了往日的雾霾,阳光透过窗户照进来,透过窗户可以看到远处的山脉与蓝天相接,这可比我那永远见不到阳光的出租屋好多了。渐渐走进的脚步声打断了我的思绪,一位小姐姐坐在了面前,甜甜的香水味立刻钻进了我的鼻孔。 小姐姐微笑地说:”您好,我是今天的面试官,那么开始吧?“ 我收起直勾勾的眼睛,说:“好的。” 小姐姐说:“在Java的异常处理中有两大组成要素:抛出异常和捕获异常。那么抛出异常可以分为哪两种呢?” 我立刻回答到:
125 0
|
XML 存储 数据可视化
做时间的朋友 —— 用印象笔记打造时间记录工具
做时间的朋友 —— 用印象笔记打造时间记录工具
515 0