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


目录
相关文章
|
7月前
|
人工智能 自然语言处理 前端开发
Trae插件Builder模式深度测评:从编程助手到AI工程师的进化
Trae插件最新推出的Builder模式标志着AI辅助编程工具从简单的代码补全向“AI工程师”角色的转变。该模式允许开发者通过自然语言描述项目需求,自动生成完整的项目结构、代码文件和开发流程,支持VSCode、JetBrains IDE及在线Web版本。Builder模式的核心功能包括自然语言项目初始化、智能项目架构设计和多文件协调代码生成,显著提升了开发效率,降低了技术门槛。然而,它在处理复杂业务逻辑和高度定制化需求方面仍有局限。未来,Builder模式将集成云部署、测试套件生成和DevOps流水线等功能
1558 2
|
8月前
|
Arthas 监控 Java
Arthas sm(查看已加载类的方法信息 )
Arthas sm(查看已加载类的方法信息 )
175 6
梦幻西游脚本,脚本编辑器,明日方舟脚本【开源代码】
梦幻西游模块包含师门任务和宝图任务自动化,采用图像识别定位关键界面元素 明日方舟
|
8月前
|
安全 Linux API
Burp Suite Professional 2025.4 发布 - Web 应用安全、测试和扫描
Burp Suite Professional 2025.4 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
398 6
Burp Suite Professional 2025.4 发布 - Web 应用安全、测试和扫描
|
8月前
|
虚拟化 iOS开发 MacOS
VMware ESXi 8.0U3e macOS Unlocker & OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动
VMware ESXi 8.0U3e macOS Unlocker & OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动
400 15
|
10月前
|
网络协议 前端开发 应用服务中间件
nginxconf.sh 自动生成 nginx tcp 转发配置文件 conf
该脚本由 eisc.cn 开发,用于自动生成 Nginx 代理配置。它根据预设的域名、IP 和端口信息,为多个项目(如 www、work、sou 等)创建对应的 Nginx 配置文件,设置前端转发、端口对端口及后端转发规则,并生成日志和 301 跳转配置。支持自动创建 CGI 解析目录,确保各项目能够正确访问。运行时需具备 root 权限或使用 sudo。
325 9
|
存储 自然语言处理 关系型数据库
mysql 8.0 日期维度表生成(可运行)
mysql 8.0 日期维度表生成(可运行)
381 2
|
安全 关系型数据库 MySQL
MySQL装机全攻略:从下载到安全配置的详细指南
出于安全考虑,建议禁止root用户通过远程连接登录MySQL数据库。可以通过修改用户权限或配置防火墙规则来实现。 创建新用户并授权: 根据实际需求,创建具有不同权限的用户账户,并为他们分配必要的数据库和表权限。这样既可以满足业务需求,又可以降低安全风险。
|
Rust 安全 Java
Rust与Java:性能与效率的较量
本文将对比Rust和Java两种编程语言在性能和效率方面的差异。我们将探讨Rust如何通过其独特的内存管理、并发模型和编译时优化来实现高性能,同时分析Java如何在虚拟机(JVM)的支持下实现高效运行。通过比较这两种语言的特性和应用场景,我们可以为开发者在选择编程语言时提供有益的参考。
2143 8