本文经授权转载自微信公众号:后端进阶

我发现数据库有些日期居然用字符串保存?于是跟几个小伙伴讨论了关于数据库的日期应该要怎么保存的问题,其实我一直都建议直接用数值保存时间戳,为什么我要这么建议呢?

以下,我会从时区的概念来跟你们解释一下,为什么用数值保存时间戳是最好的方案,同时也为了分享出来,让更多开发小伙伴留意这些细节性的东西。

相信时区对于很多人来说的很熟悉,因为地球是圆的,在地球上不同角落看到的太阳上升的角度都是不同的,即每个人对于时间的显示都是不一样的,

举个例子:

此时处于东 8 区的我们北京时间是 10 点,那么处于东 1 区的时间就是 3 点,但是他们的时间是等价的:

"2019-06-20 10:00 +8:00" = "2019-06-20 3:00 +1:00"

所以说,对于不同时区的人来说,显示的时间是不一样的,那么此时你是如何将将时间保存到数据中的呢?

我姑且假设你用的是 new Date() 方法来保存当时日期,但据我所知道的,数据库的 DateTime 类型是没有时区信息的,如果你此时用 DateTime 格式保存日期,就会丢失时区信息,如果你的服务器更该地址,从数据库读出来的日期数据就是错误的!

可能你会说,那我用 timeStamp 类型保存总不会丢失时区信息了吧?确实没丢失,没毛病。但是据我所知道的,timeStamp 保存的时间最长不能超过 2037 年,而且你要考虑每个数据的 timeStamp 类型都有可能不一样。

至于用字符串来存储时间,就更加不推荐了,姑且不从时区来说,你比较日期大小也是个问题,我举个例子:

to_char(SYSDATE, '2019-06-01 00:00:00') > START_TIME

要比较一个时间大小,我需要这么做,还需要将系统时间转成字符串来给你对比,而且在转换成字符串比较时,数据库内部也会将其转换成时间来比较,你觉得这种查询条件会好到哪里去?

我们也知道在 JDK8 中新的时间 API LocalDateTime 中,有着丰富的时区转换的方法可用,但即便你说你精通 LocalDateTime 的各种花式用法,你也不得不面对繁杂的转换。

所以,我们需要一个拥有「绝对是时间」,来帮助我们记录日期,帮我们节省下转换的时间,这个「绝对时间」就是时间戳,时间戳的定义是从一个基准时间开始算起,这个基准时间是「1970-1-1 00:00:00 +0:00」,从这个时间开始,用整数表示,以秒计时,随着时间的流逝这个时间整数不断增加。这样一来,我只需要一个数值,就可以完美地表示时间了,而且这个数值是一个绝对数值,即无论的身处地球的任何角落,这个表示时间的时间戳,都是一样的,生成的数值都是一样的,并且没有时区的概念,所以在系统的中时间的传输中,都不需要进行额外的转换了,只有在显示给用户的时候,才转换为字符串格式的本地时间。

而且很重要的一点就是,在现有的编程语言中,都提供了方法来获取时间戳,这对于我们不同语言的项目交互来说,不要太方便!所以在这里我强烈建议前后端关于时间的交互,都用时间戳来交互。

这时,可能有同学又来杠一波,你用一个出数值来表示时间,我查数据库时,以我的眼力和口算,根本不知道时间是多少,我觉得这个根本不需要担心啊,你查数据库无非是查看需要的数据而已,你在 sql 里面对时间戳字段加个转换函数就好了,比如:

from_unixtime(1561053690000)

以上时间戳是我写这篇文章的时间。

如果你还要继续杠,说我就是要在数据库表中看到时间,我觉得如果你要这样,为什么还需要前端,直接拿数据库当前端展示就好了。

我总结一下数据库用数值保存时间戳的诸多好处:

1.在数据库中日期比较不要太方便,小学一年级就会的数学题,而且性能好;2.数值对于任何系统交互来说都不存在障碍;3.基于绝对时间的数值存储,不存在时区问题;4.在交互过程中,摒弃没必要的重重转换,一个数字走天下,用户需要显示,前端只需要拿到时间戳显示正确的本地时间;5.解决了由于各个数据库对于时间实现的不一样导致的问题,比如说 Mysql 的时间函数跟 Oracle 会有一些差别,假如你现在的 sql 有某些时间函数,换了数据库很可能就会出错。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

日期居然用字符串保存?我笑了相关推荐

  1. oracle 日期排序_日期居然用字符串保存?我笑了

    点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:张乘辉 来自:后端进阶 我发现数据库有些日期居然用字符串保存?于是跟几个小伙伴讨论了 ...

  2. 6 日期字符串转日期_日期居然用字符串保存?我笑了

    我发现数据库有些日期居然用字符串保存?于是跟几个小伙伴讨论了关于数据库的日期应该要怎么保存的问题,其实我一直都建议直接用数值保存时间戳,为什么我要这么建议呢? 以下,我会从时区的概念来跟你们解释一下, ...

  3. 把一个中文日期时间格式字符串转为日期时间

    MS SQL Server2012中把一个中文日期时间格式字符串转为日期时间. 如: DECLARE @d NVARCHAR(20) = N'2012年08月12日14时36分48秒' SELECT  ...

  4. python 日期格式和字符串格式的转化

    startDate = "2018-10-01"endDate = "2018-10-31" ###字符转化为日期startTime = datetime.da ...

  5. 神奇的pdfkit工具——将字符串保存为pdf文件

    神奇的pdfkit工具--将字符串保存为pdf文件 1.安装工具包 pip install pdfkit 2.上干货 import pdfkitdef create_pdf(str_data, to_ ...

  6. php二进制保存到本地,C# 将二进制字符串保存到本地

    C# 将二进制字符串保存到本地#region 将文件保存到本地 /// /// 将文件保存到本地 /// /// 文件的二进制数据字符串 /// 文件名称,必须带后缀 private void Sav ...

  7. python去重复字符串_python3取出重复3次的字符串保存为3列

    python3 取出重复 3 次的字符串保存为 3 列 .py python-IIS7.5-web.config-rewrite 规则转 .ht , 读取配置文件对比文件 MD5.py , 读取文件 ...

  8. SharePoint2010 连接配置数据库字符串保存位置(转)

    经常有人问我这个问题,SharePoint服务器将连接配置数据库的连接字符串保存在什么地方?虽然其他SharePoint服务器场设置都是保存到了配置数据库里面,但连接配置数据库本身的连接字符串,肯定是 ...

  9. Collection的使用 字符串保存 java

    Collection的使用 字符串保存 java 创建集合 添加成员 获取长度 删除成员 按数据删除 清空集合 增强for遍历集合 使用迭代器 判断成员是否存在 判断是否为空 如果为空,就是true

最新文章

  1. day1---while循环语句和练习
  2. 字节跳动裁撤人才发展中心,企业如何做人才发展?
  3. AI打败外科医生:机器人做手术,你敢来一刀吗?
  4. percona xtrabackupd定期做全备,增量备份shell脚本
  5. Ocelot(二)- 请求聚合与负载均衡
  6. “池哥昼”的一件趣事
  7. Java使用PDFBox开发包实现对PDF文档内容编辑与保存
  8. 《系统集成项目管理工程师》必背100个知识点-81风险管理
  9. Kettle使用_11 CSV文件输入输出复制数量
  10. maven default aliyun_大家看看大佬对Maven仓库的讲解,有何高明之处?
  11. 《CSS基础教程》 读书笔记二
  12. 连不通linux 27017,mongo --host 127.0.0.1:27017 报错连不上
  13. 【优化求解】基于matlab改进的遗传算法求解带约束的优化问题【含Matlab源码 1773期】
  14. 20220521 将plecs输出的电路图转换为黑线白底
  15. C# Chart控件
  16. 【异常解决】DolphinScheduler-2.0.5 工作流实例无法调度和停止异常
  17. day12摇色子游戏--笔记
  18. TensorFlow的Dataset的padded_batch使用
  19. 使用XML作为数据库
  20. 计算机论文获奖证书,教改论文获奖证书-中国教育学会获奖证书评高级有用吗?...

热门文章

  1. 兆观毫米波监护仪亮相CMEF 开创养老监护新时代
  2. 前端基础-html-链接标签的介绍
  3. Android开发:4-3、Activity常用其他API接口、屏幕旋转
  4. (计算机组成原理)第七章输入和输出系统-第四节1:I/O方式之程序查询方式
  5. windows route netstat arp命令
  6. DRAM与SRAM的比较
  7. mysql刻度转时分秒
  8. python的接口实现zope.interface示例
  9. 设计模式:代理模式(C++)【代理服务器案例】
  10. Network Emulation(网格模拟)