日期问题合集(时令、时区)

概念

首先介绍一下有关日期的相关概念

时区

时区是地球上的区域使用同一个时间定义。以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同经度的地方的时间有所不同(地方时)。1863年,首次使用时区的概念。时区通过设立一个区域的标准时间部分地解决了这个问题。世界各个国家位于地球不同位置上,因此不同国家的日出、日落时间必定有所偏差。这些偏差就是所谓的时差。
来源:https://blog.csdn.net/fanst_/article/details/50627744

GMT:(Greenwich Mean Time)代表格林尼治标准时间
UTC:协调世界时,又称世界标准时间或世界协调时间
CST:被视为美国、澳大利亚、古巴或中国的标准时间
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
CDT:夏令时时间
除此之外还有每个国家自己设定的比如Asia/Shanghai

分析

来看看这些有什么不一样:
UTC:时间戳就是通过UTC的1970-01-01至今算出来的,UTC与GMT+0所表示的时间是一样的都是0时区。
GMT:这个就是咱们比较熟悉的了,平常总是在用,但之前了解都是一星半点。咱们所在北京就是GMT+8的时区,在这个经度上的国家都可以使用GMT+8时区
CST:他同时代表了四个地方的时区,而不同使用场景他表示的就不一样,像在java中CST代表的是中国的,而js好像代表的就是美国的,mysql中CST代表的也是美国的时区。
时间戳:时间戳就是UTC的1970年1月1日到某个时间点走过的毫秒数。他是没有时区的概念的,只是在不同的时区的地方对于同一个时间戳展示的时间也不同,因为时间戳解析出来的是相当于GMT+0的1970-01-01…的时间,但自己的时区不在GMT+0的话,那么时间就不同了。

时令

时令问题也是最近才了解到的。时令是每个国家自己设定的。拿中国举例,在中国的1986年-1991年这6年中实行了时令。就是说为了省电,在夏天的时候,这几年的四月中旬那周的周日会在凌晨2点将时钟向后拨1小时,也就是说在正常2点的这个时刻,如果说支持夏令时看到的就是3点,不支持夏令时看到的就是2点。时区如果是Asia/Shanghai或是中国的CST,那么就是支持夏令时的,看到的时间就是3点,而如果用GMT+8来看的话那就是2点。
来做个时间

public class DateTest {public static void main(String[] args) throws ParseException {test1();System.out.println("================================\n\n");test2();}/*** 使用系统默认时间parse转换时间*/public static void test1() throws ParseException {System.out.println("系统默认时区------->"+ TimeZone.getDefault().getID());SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");Date date1 = simpleDateFormat.parse("1988-07-28");Date date2 = simpleDateFormat.parse("1998-07-28");System.out.println("使用系统默认时区转换得到时间(在夏令时中)------>"+date1);System.out.println("使用系统默认时区转换得到时间(不在夏令时中)------>"+date2);TimeZone timeZone = TimeZone.getTimeZone("GMT+8");TimeZone.setDefault(timeZone);System.out.println("时区设置成为------->"+timeZone.getID());System.out.println("时间转成GMT+8时间(在夏令时中)"+date1);System.out.println("时间转成GMT+8时间(不在夏令时中)"+date2);}public static void test2() throws ParseException {TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));System.out.println("系统默认时区------->"+ TimeZone.getDefault().getID());long startTime = 586022400000L;Date date1 = new Date(586022400000L);Date date2 = new Date(901555200000L);System.out.println("时间戳转成默认时区的时间(在夏令时中)----->"+date1);System.out.println("时间戳转成默认时区的时间(不在夏令时中)----->"+date2);TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));System.out.println("时区设置成为------->GMT+8");System.out.println("时间转成GMT+8时间(在夏令时中)"+date1);System.out.println("时间转成GMT+8时间(不在夏令时中)"+date2);}}

结果:

系统默认时区------->Asia/Shanghai
使用系统默认时区转换得到时间(在夏令时中)------>Thu Jul 28 00:00:00 CDT 1988
使用系统默认时区转换得到时间(不在夏令时中)------>Tue Jul 28 00:00:00 CST 1998
时区设置成为------->GMT+08:00
时间转成GMT+8时间(在夏令时中)Wed Jul 27 23:00:00 GMT+08:00 1988
时间转成GMT+8时间(不在夏令时中)Tue Jul 28 00:00:00 GMT+08:00 1998
================================系统默认时区------->Asia/Shanghai
时间戳转成默认时区的时间(在夏令时中)----->Thu Jul 28 01:00:00 CDT 1988
时间戳转成默认时区的时间(不在夏令时中)----->Tue Jul 28 00:00:00 CST 1998
时区设置成为------->GMT+8
时间转成GMT+8时间(在夏令时中)Thu Jul 28 00:00:00 GMT+08:00 1988
时间转成GMT+8时间(不在夏令时中)Tue Jul 28 00:00:00 GMT+08:00 1998Process finished with exit code 0

常用的SimpleDateFormat类中有个方法可以设置时区 sdf.setTimeZone(TimeZone.getTimeZone(timeZoneId));
对于parse方法来说:设置的是parse出来的日期是哪个时区的时间
对于format方法来说:设置指定待解析的时间是哪个时区的时间

MYSQL中时区

查看数据库时区:show variables like ‘%time_zone%’;

默认采用的是CST。
注意:还记得前面说CST可以代表多个时区吗,在这MySql他代表了美国的时区(UTC-06:00或UTC-05:00)。
为什么呢美国规定每年从“3月11日”至“11月7日”实行夏令时,美国中部时区改为UTC-05:00;而“11月7日”至“3月11日”实行冬令时,美国中部时区改为UTC-06:00,博主的线上问题发现的时间是2019年1月9日,而此时美国中部的时区是UTC0600,而我们的时区是UTC0800,所以6+8=14个小时,因此错误时间的相隔14个小时。
我们可以设置全局默认时区:set global time_zone = ‘+08:00’,也可以设置数据库的连接参数设置为GMT+8。

此外

TIMESTAMP和DATETIME的不同点:

对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。

而对于DATETIME,不做任何改变,基本上是原样输入和输出。
做个实验:在两个表中一个是datetime类型的,一个是timestamp类型的,存储同一个时间,然后查看看到的时间是一样的

修改时区后再次查看,可以看到存储为datetime的还是原来的值,而timestamp的值就变了

两者存储时间的范围也是不一样的:
timestamp所能存储的时间范围为:‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’。

datetime所能存储的时间范围为:‘1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’。

日期问题合集(时令、时区)相关推荐

  1. php、git、redis函数合集

    ################################PHP################################### 一. 数学函数 1.abs(): 求绝对值 求绝对值 $a ...

  2. php基础从入门到面向对象(大合集)

    php基础复习应用大合集 1.不知道有没有人很长不是不复习基础或者一些编程思想,会忘记,博主呢秉承着温故而知新的道理把基础从到位复习了一边,其中还包括一些算法指针,统计目录,字符串,数组的方法,mvc ...

  3. 2017年8月前端开发者超实用干货大合集

    2017年8月前端开发者超实用干货大合集 在过去的几年当中,网络上所流传的各种设计和开发资源,在素质上有明显的提升.其中有一些已经几乎成为了设计师和开发者必备的工具,但是其中绝大多数由于其应用范畴的局 ...

  4. 暑期干货!2017年8月前端开发者超实用干货大合集

    在过去的几年当中,网络上所流传的各种设计和开发资源,在素质上有明显的提升.其中有一些已经几乎成为了设计师和开发者必备的工具,但是其中绝大多数由于其应用范畴的局限,或者传播不够广,导致它们大多并广为人知 ...

  5. 常用正则表达式合集与工具

    any-rule 维护了一个常用正则表达式合集,并且本身是一个支持 Web/VS Code/idea/Alfred Workflow 多平台的正则表达式工具. image 安装 VS Code 应用商 ...

  6. python基础语法合集-Python基础语法合集.zip

    [实例简介]精心整理的Python基础语法合集,变量,循环,输入输出等等都有,主要是知道概念和怎么用的 如果打开文件后有文字变成符号的,先把字体改为宋体就正常了 [实例截图] [核心代码] 目录 了解 ...

  7. 网络工程师人手必备!常用网络命令合集请收下

    [欢迎关注微信公众号:厦门微思网络] 微思网络(官网):https://www.xmws.cn/ 在计算机网络中经常要对网络进行管理,测试,这时就要用到网络命令.今天就为大家整理了一些网络工程师必备的 ...

  8. ai包装插件_找AI插件很费劲,一次给你66款AI插件合集!每一款都是设计师常用...

    作为设计师我们都知道,PS插件很常见也很多,但AI的却不好找,但其实Adobe Illustrator软件除了能够绘制高精度的矢量图之外,也可以为线稿提供较高的精度和控制,适合生产任何小型设计到大型的 ...

  9. Web测试到底是在测什么(资料合集)

    http://www.cnblogs.com/idotest/p/6838583.html 图片略模糊 看得清就好 Web测试, 进行抽离拆分,基本上就如上一些内容. 不管是测什么系统,什么功能,基本 ...

最新文章

  1. iOS 打电话回到当前应用
  2. 华为魔术手机拆机图解_华为P40 Pro上手体验
  3. 清华医工结合项目及三创项目与天津市27家重点医院对接
  4. Fedora15上实现桌面背景图片渐变
  5. 提高PHP编程效率的53个要点
  6. 神策数据宣布与微软进行深度合作 共拓大数据生态圈
  7. static_const和reinterpret_cast
  8. 代理模式中的静态代理
  9. 苹果雪豹操作系统正式版_iOS 12.3.1正式版“意外”推送,iPhone修复诸多问题!...
  10. Classification Example
  11. mysql druid读写分离_springboot+mysql+jpa+sharding-jdbc+druid读写分离
  12. (2)Linux环境下安装和使用Redis
  13. Apple ID更换绑定的受信任电话号码教程
  14. html5微信mp3播放器代码,[微信音频播放器] html5 audio 制做的微信播放器
  15. AUTOCAD——表格样式
  16. 历经8年美团成功上市!回到起点看王兴,梦想并非遥不可及!
  17. Android camera2扫描
  18. NO.90——京东用户购买意向预测之数据预处理
  19. 华为OD机试真题 Python 实现【数字涂色】
  20. 虚拟服务器伪静态怎么设置,虚拟主机怎么配置伪静态

热门文章

  1. python html模板引擎_flask入门2-模板引擎
  2. VR视频拍摄手法学习笔记
  3. new HashMap(list.size())指定size就能完全避免扩容带来的额外开销了吗?
  4. 教你1个转换小技巧,免费多张jpg合并成pdf
  5. R的内存管理和垃圾清理
  6. win7 简易版升级旗舰版
  7. 论文分享-《基于数据驱动多输出 ARMAX 建模的高炉十字测温中心温度》
  8. iOS Swift RxSwift 的使用(二)
  9. Quartus固化程序到flash芯片
  10. nginx服务器报错502 bad gateway!