坑~夏令时冬令时引发的时间换算问题

更新时间:2023-06-11 08:17:10 阅读: 评论:0

坑~夏令时冬令时引发的时间换算问题
起因
最近接触到⼀些国外的项⽬,由于国内外有时差这个东西,对于某些基础数据存到数据库的时候需要记录时间,为了⽅便,这⾥采⽤了时间戳(int或者timestamp)记录。由于时间戳全球都是⼀样的,需要的时候根据时区进⾏转换就能够拿到当地的时间。
嗯~ o(* ̄▽ ̄*)o,这样看起来确实没什么⽑病。众所周知,⼀天有24⼩时,换算成秒就是:24*60*60=86400秒。
然⽽,我在某次使⽤ MySql 的FROM_UNIXTIME发现⼀个问题,两个时间相差86400秒,但是格式化之后却不是相差⼀天
假设北京时间2019年11⽉25⽇ 12:00:00,对应的时间戳是:1574654400,照理说这个时间戳加上⼀天86400秒,理论上就是北京时间2019年11⽉26⽇ 12:00:00,事实上确实如此,国内的话这么算确实没什么问题,但是如果是国外时区的话,那可能会出问题。
由于国外部分国家有夏令时和冬令时之分(具体下⾯会细说),直接加上86400秒可能会有问题。
感兴趣的可以拿1572764400(太平洋时间2019-11-03 00:00:00,单位:秒)这个时间戳验证下
拿代码演⽰下:
PHP:
<?php
echo "PST时区的时间\n";
date_default_timezone_t('PST8PDT');
echo date('Y-m-d H:i:s',1572764400);
echo "\n";
echo date('Y-m-d H:i:s',1572764400+86400);
echo "\n";
//换个时区
echo "换成上海时区看看\n";
date_default_timezone_t('Asia/Shanghai');
echo date('Y-m-d H:i:s',1572764400);
echo "\n";
echo date('Y-m-d H:i:s',1572764400+86400);
echo "\n";
运⾏结果:
PST时区的时间
2019-11-03 00:00:00
2019-11-03 23:00:00
换成上海时区看看
2019-11-03 15:00:00
2019-11-04 15:00:00
明明是同⼀个时间戳,都是加上86400(⼀天),为什么在上海这个时区是第⼆天,⽽在PST(美国太平洋时区)只加了23⼩时?神不神奇!意不意外!
为了弄清楚这个问题,⾸先得先了解下什么是夏令时,什么是冬令时
夏令时
夏令时,表⽰为了节约能源,⼈为规定时间的意思。也叫夏时制,夏时令(Daylight Saving Time:DST),⼜称“⽇光节约时制”和“夏令时间”,在这⼀制度实⾏期间所采⽤的统⼀时间称为“夏令时间”。
⼀般在天亮早的夏季⼈为将时间调快⼀⼩时,可以使⼈早起早睡,减少照明量,以充分利⽤光照资源,从⽽节约照明⽤电。各个采纳夏时制的国家具体规定不同。⽬前全世界有近110个国家每年要实⾏夏令时。[1]
冬令时
有夏令时就会有冬令时。⾼纬度和中纬度的许多国家在夏季到来前,把时针拨快⼀⼩时,新的时间就是夏令时,到下半季秋季来临前,再把时针拨回⼀⼩时,即形成冬令时。 [2]
夏令时和冬令时的影响
拿美国来说,美国各个地区的时间都不同,不像中国⼀样统⼀使⽤北京时间,美国⼀般以三⽉份第⼆个周⽇凌晨两点当成夏季的开始,⼗⼀⽉份第⼀个周⽇的凌晨两点当成冬季的开始。
所以在每年的三⽉份第⼆个周⽇凌晨两点过后,时间就会往前调快⼀个⼩时;同理,⼗⼀⽉份第⼀个周⽇把这⼀个⼩时调回来。
你也可以理解成美国那边,⼀年⾥⾯有⼀天只有23⼩时(夏天开始那⼀天),有⼀天有25⼩时(冬天开始那⼀天),其他时间每天都是24⼩时。
所以你会发现,夏天的时候,中国的北京时间(东⼋区)与美国太平洋时区(西⼋区)的时差是15⼩时,⽽到了冬天却变成16⼩时
解决⽅案
回到开头那个问题,如果我们想直接算第⼆天,直接加上86400(⼀天)可能在其他国家就会有我上⾯那个夏令时和冬令时时间换算的问题,要如何避免呢?⾸先能够确定的是,直接加上86400是不可取的,如果加上⼀天能否⾏得通
PHP:
<?php
echo "PST时区的时间\n";
date_default_timezone_t('PST8PDT');
echo date('Y-m-d H:i:s',1572764400);
echo "\n";
echo date('Y-m-d H:i:s',1572764400+86400);
echo "\n";
echo "--------------------------\n";
echo date('Y-m-d H:i:s',1572764400);
echo "\n";
echo date('Y-m-d H:i:s',strtotime('+1 day',1572764400));
echo "\n";
运⾏结果:
PST时区的时间
2019-11-03 00:00:00
2019-11-03 23:00:00
--------------------------
2019-11-03 00:00:00
2019-11-04 00:00:00
可以看出,不直接加上86400,直接在⽇期上加上⼀天是完全没问题的。
JavaScript:
var date = new Date(1572764400*1000);
date.Date()+1);
var timestamp = Time()/1000);
注意:JS的时间戳是毫秒
结论
在经济全球化快速发展的今天,在软件开发的过程中,尽量养成习惯,由于夏令时和冬令时不是固定的,开发在时间计算上应该慎⽤86400进⾏加减运算,时间计算请直接对⽇期进⾏加减,展⽰时间给⽤户看的时候尽量结合当地时间,结合夏令时和冬令时计算出准确的当地时间,避免产⽣不必要的分歧。
参考:
[1].
[2].

本文发布于:2023-06-11 08:17:10,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/zhishi/a/1686442630196786.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:坑~夏令时冬令时引发的时间换算问题.doc

本文 PDF 下载地址:坑~夏令时冬令时引发的时间换算问题.pdf

下一篇:返回列表
标签:时间   问题   加上   冬令   北京   时候   美国   国家
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 实用文体写作网旗下知识大全大全栏目是一个全百科类宝库! 优秀范文|法律文书|专利查询|