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

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

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

举个例子:

此时处于东 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 有某些时间函数,换了数据库很可能就会出错。

近期热文

我对支付平台架构设计的一些思考

聊聊Tomcat的架构设计

从源码的角度解析线程池运行原理

RocketMQ消息发送的高可用设计

深度解析RocketMQ Topic的创建机制

RocketMQ源码分析之路由中心

mybatis-plus源码分析之sql注入器

钟同学,this is for you!

Mybatis-spring源码分析之注册Mapper Bean

基于Jenkins Pipeline自动化部署

Dubbo服务暴露之注册地址和端口

Dubbo全链路追踪日志的实现

长按可以订阅

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

  1. ddmmyy日期格式是多少_日期格式

    date9.===>16feb2018 yymmdd10.===>2018-04-22 yymmddn8.===>20180422 输入日期 日期宽度 INFORMAT 03/11/ ...

  2. python字符串拼接数字_解决Python中字符串和数字拼接报错的方法

    解决Python中字符串和数字拼接报错的方法 前言 众所周知Python不像JS或者PHP这种弱类型语言里在字符串连接时会自动转换类型,如果直接将字符串和数字拼接会直接报错. 如以下的代码: # co ...

  3. lua字符串转数组_深入Lua:字符串管理

    Lua的字符串对象表示为下面结构: typedef struct TString {CommonHeader;// 字符串的子类型有两种:长字符串和短字符串// 短字符串:extra表示Lua保留字的 ...

  4. java字符串连接效率_关于java:字符串连接中的“+”是否会影响效率?

    本问题已经有最佳答案,请猛点这里访问. 我在java中使用过String,StringBuilder和StringBuffer. 我想到了这个问题,而我从效率的角度思考. 字符串连接中的"+ ...

  5. python字符串的内部函数_「Python」字符串操作内置函数

    目录: capitalize casefold center count encode decode endswith expandtabs find format format_map index ...

  6. python 逗号赋值_python中字符串赋值 逗号_四、python字符串

    4.1.字符串基本操作 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最大值.最小值)都适用于字符串. 字符串是不可变的,因此所有的元素赋值和切片赋值都是非法的. 4.2.设置字符串的格式 ...

  7. C#.Net工作笔记008---c# 日期时间大小比较_日期相减

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 /// <summary>         /// 比较两个日期大小         ...

  8. mysql 日期索引的使用_日期使用

    mysql 日期索引的使用 时区糟透了. 特别是夏令时. 我不介意像与此行为相关的编程错误那样,不停移动时钟或失去一个小时的睡眠. 更糟糕的是Java的旧日期/时间API. Java社区通过JSR 3 ...

  9. Java中什么是字符串的拷贝_关于java中字符串对象的拷贝

    1两种数据类型 java中有两种数据类型: 基本数据类型 引用数据类型 基本数据类型有整型.浮点型的数字常量和字符常量,而类是引用数据类型,所谓引用就是一个对象等于另外一个对象时(前提同一类),都使用 ...

  10. java将表情字符串转表情符号_使用java将字符串中的表情符号替换为字符串

    如何从字符串中删除表情符号我的简单代码是.. public static void main(String[] args) throws SQLException { String str=" ...

最新文章

  1. php tp5路由教程,附件八 TP5路由设置源码
  2. java 投票算法_Boyer and Moore Fast majority vote algorithm(快速选举算法)
  3. 本地同时修改2个版本
  4. oralce 11g rac ocr和votedisk迁移
  5. 解题报告:hdu 1556 Color the ball(区间修改,单点查询)
  6. Memcache 查看列出所有key的方法
  7. BZOJ3697 采药人的路径 【点分治】
  8. selenium+python3+excel测试框架
  9. 计算机配件详情图解,电脑装机教程,详细教您怎么组装电脑
  10. 0806 07 08 09 12上午数据库
  11. 【无标题】iTunes更新报错1110错误代码
  12. 史上最拉跨的导线平差程序( by C#)
  13. c++直角空心三角形_压轴题中对三角形中位线的另类诠释
  14. 《仿美团》项目研发总结
  15. 【USACO1.3.3】最棒的回文
  16. 国内IT公司病的有多重?技术圈交际花谈软件研发管理怪现状
  17. 提高PLC编程能力的6种电路,新手必学!
  18. 基于JAVA设计师品牌服装租赁网站计算机毕业设计源码+数据库+lw文档+系统+部署
  19. windows10本地部署PHP
  20. 商业计划书撰写“五步法”

热门文章

  1. Redis的安装及原理介绍
  2. html和css的重难点知识
  3. [C#]加密解密 MD5、AES
  4. js数据类型 方法 函数
  5. 【转载】关系型数据库设计范式
  6. CentOS7安装Nmon(linux性能监控工具)
  7. 关于NSArray使用时用strong修饰还是copy修饰问题测试
  8. Apache Arrow 内存数据
  9. Android 内存管理之优化建议
  10. 《Linux 就是这个范儿 - 阅读笔记2》 融于心而表于行(1)