日期居然用字符串保存我笑了

  • 日期:07-13
  • 点击:(872)

澳门金沙银河娱乐网站

作者:张乘辉

来自:公众号后端进阶

bf0b06eb-9edd-4cf2-bcaf-d3c78c349651

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

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

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

举个例子:

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

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

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

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

XXMaybe you will say, then I will not lose time zone information when I save with timeStamp type? Really not lost, no problem. But as far as I know, timeStamp can't be stored for up to 2037, and you should consider the timeStamp type of each data to be different.

As for the use of strings to store time, it is even less recommended. For the time zone, it is also a problem to compare the date size. Let me give you an example:

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

Where will the pieces go?

We also know that there is a rich time zone conversion method available in the new time API LocalDateTime in JDK8, but even if you say that you are proficient in the various fancy usages of LocalDateTime, you have to deal with complicated conversions.

Therefore, we need to have "absolutely time" to help us record the date and save us the time to convert. This "absolute time" is the timestamp. The definition of the timestamp is calculated from a reference time. The time is "1970-1-1 00: 00: 00 +0: 00". From this time on, it is represented by an integer, which is counted in seconds, and this time integer increases continuously with the passage of time. In this way, I only need a value, it can perfectly represent the time, and this value is an absolute value, that is, regardless of the corner of the earth, the timestamp representing the time is the same, generated The values are the same, and there is no concept of time zone, so no additional conversion is required in the transmission of the system's medium time, only when it is displayed to the user, it is converted to the local time of the string format.

xx值得注意的是,在现有的编程语言中,提供了获取时间戳的方法,这对于我们在不同语言中的项目交互来说并不太方便!所以在这里我强烈建议前后交互与时间结束,使用时间戳进行交互。

这时,有些学生可能会再次来到酒吧。您使用数值来表示时间。当我查看数据库时,我用我的视力和嘴来计算,我不知道现在是什么时候。我认为这根本不用担心。检查数据库只不过是查看所需的数据。您可以将转换函数添加到sql中的timestamp字段,例如:

FROM_UNIXTIME(1561053690000)

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

如果你想继续吧,说我想在数据库表中看到时间,我想如果你想这样做,为什么你需要前端,只需要把数据库的当前显示就好了。

让我总结数据库保存时间戳的许多好处,包括值:

1.在数据库中,日期不太方便,小学一年级的数学问题,表现良好;

2.价值观不妨碍任何系统互动;

3.基于绝对时间值存储,没有时区问题;

4.在交互过程中,丢弃不必要的转换,一个数字传到世界,用户需要显示,前端只需要获取时间戳来显示正确的本地时间;

5.解决了每个数据库不同时间造成的问题。例如,Mysql的时间函数与Oracle有一些差异。如果您当前的sql具有一些时间函数,则更改数据库时可能会出错。