夏令时 moment isDST

何谓夏令时
  • 夏令时,表示为了节约能源,人为规定时间的意思。也叫夏时制,夏时令(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。全世界有近110个国家每年要实行夏令时。
  • 我国夏令时是从1986年4月开始,具体作法是:每年从四月中旬第一个星期日的凌晨2时整(北京时间),将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;到九月中旬第一个星期日的凌晨2时整,再将时钟拨回一小时,即将表针由2时拨至1时,夏令时结束。
  • 从1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。在夏令时开始和结束前几天,新闻媒体均刊登有关部门的通告。1992年起,夏令时暂停实行。
日期解析格式
  • 目前碰到的日期解析格式有两种, 一个是标准格式, 一个是夏令时格式
    贴图为证
    夏令时格式.jpg

    标准格式.jpg
解决思路

1: 因为时区问题, 客户进行时间搜索时, 可能把本地的时间戳拿到, 这个时候, 就会出现问题,
(因为我们的数据以及页面都是基于北京+8时间来进行的, 客户传给我们的时间戳,
如果不加+8判断的话, 可能搜的就是北京时间以外的数据,我们要让他遵循北京时间来进行功能操作)
解决方法:
拿到时间戳后转为+8地区,再转成时间戳发送, 这样就可以拿到正确的数据了。
2: 拿到时间戳后要将他渲染成北京+8的时间,并且转换成夏令时格式
解决方法:
拿到时间戳后,可以使用moment插件, 使用对应的方法,(并且要兼容夏令时) 实现这个功能

题1:如何解决在不同的系统时区中拿到 东八的时间戳

  let startTime = new Date().FormatTime();
  let endTime = new Date(new Date().FormatTime().getTime() + 24 * 60 * 60 * 1000 - 1);
  // 拿到对应的日期时间
  Date.prototype.FormatTime = function() {
    let str = this.getBJDate();
    let start = new Date(str).toLocaleDateString();
    let nowDate = new Date(start);
    return nowDate;
  };

  //  拿到对应的北京时间戳 
  Date.prototype.getBJDate = function() {
    //获得当前运行环境时间
    var d = new Date(),
    currentDate = new Date(),
    tmpHours = currentDate.getHours();
    //算得时区
    var time_zone = -d.getTimezoneOffset() / 60;
    //少于0的是西区 西区应该用时区绝对值加京八区 重新设置时间(西区时间比东区时间早 所以加时区间    隔)
    if (time_zone < 0) {
      time_zone = Math.abs(time_zone) + 8;
      currentDate.setHours(tmpHours + time_zone);
    } else {
      //大于0的是东区  东区时间直接跟京八区相减
      time_zone -= 8;
      currentDate.setHours(tmpHours - time_zone);
    }
    return currentDate;
  };
题2:如何解决夏令时在页面中的显示问题
  • 事情的起因是这样的, 在日常项目开发中, 突然发现页面展示的日期同从页面下载的pdf、excel 里面的日期有出入,并且展示效果会随着本地系统时区进行改变。
  • 解决方法:使用moment插件
    注意 isDST()在1.2.0+版本上才可以使用
    \color{red}{*} 下方例子适用于电脑设置为东八区能解析夏令时格式的机器
  let filter = {};
  import moment from "moment";
  filter.formatDate = (value, format = "YYYY-MM-DD") => {
    let weekList = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
    if (format) {
      if (format === "e") {
        var weekIndex = moment(value).days();
        return weekList[weekIndex];
      }
    } else {
      format = "YYYY-MM-DD";
    }
    // value 是时间戳
    if (isNaN(value)) return value;
    if (value) {
      value = Number(value);
      format = "YYYY-MM-DD HH:mm:ss";
      if (moment(value).isDST()) {
        return moment(value).utcOffset(9).format(fmt);
      }
      return moment(value).utcOffset(8).format(format);
    } else {
      return "";
    }
  }

  filter.install = function(Vue) {
    for (var filterName in filter) {
      if (filter.hasOwnProperty(filterName) && filterName !== "install") {
        Vue.filter(filterName, filter[filterName]);
      }
    }
  };
  export default filter;

\color{red}{*}别走, 下面还有

扩展:其实到这一步,基本的功能都已经完善了。但是, 夏令时怎么可能让你那么轻松。
  • 当我们把项目部署好以后, 由于不同时区的影响,我们的显示效果又发生了变化, 查询原因, 原来是因为上面使用的isDST的问题 ,接着我们捋一捋原因
    何谓isDST? 来看下官网解释:
       moment().isDST(); // 检查当前时刻是否为夏令时
       moment([2011, 2, 12]).isDST(); // false, 2011年3月12日不是 DST。
       moment([2011, 2, 14]).isDST(); // true, 2011年3月14日是 DST。
       // 此示例适用于 "en" 语言环境:https://www.timeanddate.com/time/dst/2011.html
    
    看了一篇文章, 以下是我的见解:
    "在实际操作中, 它运行时考虑了电脑本机得时区, 也就是说会根据你本地电脑得时区解析夏令时规 则,所以会造成在不同电脑得时区上显示不一样得时间."
    目前暂时还未发现能解决问题得方法, 建议由后端转换完后以后在接口返回前端显示, 这样避免了时区错误问题,
    贴上借鉴得文章: 里面有一个moment-timezone的方法, 可以试下能不能解决这个问题,
    momentjs
    momentjs-timezone
    https://www.it1352.com/1633225.html
结尾:

又到了对一个知识点得回顾与总结的时候,温故而知新, 希望小伙伴们看完可以有一点收获,
觉得不错的可爱们请点赞哦👍👍👍

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342