游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

取而代之!以后不用再newDate()了

  Date背景
  众所周知,在1995年,Brendan(JavaScript之父)被网景公司安排了一个巨大而紧急的工作任务,用10天的时间来编写JavaScript语言。而日期处理是几乎所有编程语言的基本部分,所以JavaScript也必须拥有它。
  这是一个非常复杂的领域,但留给作者编写它的时间却很短。最终Brendan选择了借鉴当时红极一时的java语言,从java。Util。Date日期实现中复制了Javascript的日期对象。坦率地说,这个实现很糟糕。事实上Java在两年后的1。1版本中就弃用和替换这种实现。然而20年后,我们仍然在JavaScript编程语言中使用这个API。Date存在的问题不支持除用户本地时间以外的时区
  不支持开发人员通过API来切换时区信息。解析器行为不可靠以至于无法使用
  newDate();
  newDate(value);
  newDate(dateString);
  newDate(year,monthIndex〔,day〔,hours〔,minutes〔,seconds〔,milliseconds〕〕〕〕〕);
  开发人员常常因为输入的参数格式问题,引发时间错误,导致程序崩溃。比如输入(20220222)和(2022,02,22)得到的结果却不同,计算API缺失
  涉及时间的运算逻辑通常都需要开发人员自己去写,比如比较两个时间的长短,时间之间的加减运算,没有自己的计算API不支持非公历
  除了全球通用的公历外,无法使用各国的自己的历法。比如中国的农历Temporal的诞生
  为了弥补Date的缺陷,很多程序员着手开发一些开源的库来绕过对Date的直接使用,比较优秀的npm库如date。js、moment。js,但Date的问题始终困扰着Javascript这门语言的进一步发展,于是TC39组织开始了对Date的升级改造,他们找到了moment。js库的作者,Maggie,由她来担任新特性Temporal的主力设计。
  感兴趣的同学可以去博客〔1〕阅读更多细节,该网页的控制台已经支持Temporal对象或者在本地运行,安装Temporal的polyfill
  npminstalljstemporalpolyfill
  import{Temporal}fromjstemporalpolyfill;
  Temporal是一个全局对象,像Math、Promise一样位于顶级命名空间中,为Javascript语言带来了现代化的日期、时间接口。
  如图所示,一个全面的Temporal包含三个部分:
  绿色区域为ISO8601格式的日期和时间;
  黄色区域为时区(日本东京);
  红色区域为日历(日本历法);
  ISO8601格式:国际通用时间格式,T用来分割日期(20200805)和时间(20:06:13),或者分别代表东时区和西时区。09:00,代表东九区。
  对比Date
  newDate()
  FriJan28202217:03:11GMT0800(中国标准时间)
  Date采用GMT格式(旧的时间表示格式)的时间,使用方面不如ISO8601通用,同时不包含时区和历法。Temporal各种类型介绍
  推翻重新设计的Temporal,包含5种主要类型,每个类型负责不同的功能,类型之间还可以相互进行转换。
  学会了这5种类型的功能以及类型的之间的关系,就基本掌握了Temporal。
  下面是Temporal各种类型的功能与转换关系图,非常重要,十分有利于我们全面理解和使用Temporal,下文将逐步讲解。
  ZonedDateTime
  定义:最全面的Temporal类型,与时区和日历都有关联。表示从地球上特定区域的角度来看,在特定时刻发生的事。
  使用场景:在北京时间的2008年5月12日14时28分4秒发生汶川大地震,或者在纽约时间的2008年5月12日01时28分4秒发生了汶川大地震。如何获得一个ZonedDateTime类型?
  不仅是获得一个ZonedDateTime类型,其实所有的Temporal类型都是一样的获取途径。通常有两种方法获得,分别是new构造函数(),和from方法。new构造函数()方式
  参数:(纳秒数,时区,日历),不同类型要求的参数不同。
  纳秒数:从Unix纪元(1970年1月1日午夜UTC)计算,所经过的纳秒数,单位为bigint
  时区,日期:可以是字符串,也可以是Temporal类型。
  newTemporal。ZonedDateTime(0n,AsiaShanghai,chinese);
  Temporal。ZonedDateTime19700101T08:00:0008:00〔AsiaShanghai〕〔ucachinese〕
  通常每个Temporal类型的都有toString()方法,覆盖了Object。prototype。toString()方法,作用是通过一个字符串表示Temporal
  调用toString()用字符串来表达,方便阅读。
  newTemporal。ZonedDateTime(0n,AsiaShanghai,chinese)。toString();
  19700101T08:00:0008:00〔AsiaShanghai〕〔ucachinese〕
  这个ZonedDateTime的类型含义为,从北京时间看,unix纪元起始时间为19700101T08:00:0008:00,而非19700101T00:00:0000:00from()形式获得一个Temporal类型
  from()的参数更为多样,同时支持溢出处理(下文有讲解),所以通常作为首选方法。通常作为获得一个Temporal类型的首选方法。
  接受字符串
  Temporal。ZonedDateTime。from(20220228T00:00:0008:00〔AsiaShanghai〕)。toString();
  20220228T00:00:0008:00〔AsiaShanghai〕
  or
  接受对象,({时区,日期,日历},options)
  options代表容错机制配置,即可以处理输入的日期溢出问题,有两种配置选项,{overflow:constrain}:自动处理溢出。{overflow:reject},日期溢出则报错。
  比如下面例子中,2022年2月一共28天,如果选择了constrain配置,输入日期超过了会进行溢出处理,即匹配最接近的存在值。
  输入31天,得到28天
  Temporal。ZonedDateTime。from({timeZone:AsiaShanghai,year:2022,month:2,day:31},{overflow:constrain})。toString();
  20220228T00:00:0008:00〔AsiaShanghai〕
  选择reject配置,日期超出则报错。
  Temporal。ZonedDateTime。from({timeZone:AsiaShanghai,year:2022,month:2,day:31},{overflow:reject})。toString();
  RangeError:valueoutofrange:13128
  Instant
  定义:负责单个时间点(称为精确时间),精度以纳秒为单位。不存在时区和日历信息。
  使用场景:20200123T17:04:36。49186512108:00,只用来表达一个瞬间的时间,没有其他意义。获得一个Instant类型
  newTemporal。Instant(bigint)
  bigint:纳秒数,从Unix纪元(1970年1月1日午夜UTC)计算,所经过的纳秒数,单位为bigint
  newTemporal。Instant(1553906700000000000n);
  20190330T00:45:00Z
  newTemporal。Instant(0n);
  19700101T00:00:00Z
  newTemporal。Instant(2208988800000000000n);
  19000101T00:00:00Z
  Z在ISO8601时间格式表示,没有时区关联。
  Temporal。Instant。from(thing:any)
  from方法在生成Instant时,会考虑时区的偏差。
  Temporal。Instant。from(20190330T01:45:0001:00〔EuropeBerlin〕);
  Temporal。Instant。from(20190330T01:4501:00);
  Temporal。Instant。from(20190330T00:45Z);
  虽然前两个携带了时区信息,但获取到的Instant时间值相同,三个都是20190330T00:45Z
  PlainXX系列
  负责Temporal的日历日期(xx年xx月xx日)和钟表时间(xx点xx分xx秒)表达,不涉及时区,
  使用场景:日历日期:小红的生日是农历每年3月25。钟表时间:现在是下午2:00
  对比Instant,双方的使用场景不同,内部的属性也不同,Instant不包含时区和日期,PlainXX系列则包含日历。
  PlainXX系列包含5种类型,覆盖最广的PlainDateTime包含日期和时间,还有只包含日期的Plaindate和只包含时间的Plaintime。日期类型里,还有分类更精细的PlainYearMonth(年月)和PlainMonthDay(月天)
  以PlainDateTime举例,其他的类同。获取一个PlainDateTime
  newTemporal。PlainDateTime(year,month,day。。。)
  参数以年纳秒顺序排列,其中年月日,为必填项,其余选填。
  newTemporal。PlainDateTime(2020,3,14,13,37)
  20200314T13:37:00
  Temporal。PlainDateTime。from()
  Temporal。PlainDateTime。from({year:2001,month:1,day:1,hour:25,calendar:chinese},{overflow:constrain})。toString()
  20010124T23:00:00〔ucachinese〕
  TimeZone
  定义:负责Temporal时区的相关信息。
  例子:北京时区,东八区,不单独使用,通常结合其他类型搭配。获取一个TimeZone类型
  newTemporal。TimeZone(string)
  string:对一个时区的描述
  东八区,即北京时间
  newTemporal。TimeZone(8:00);
  直接字符串描述,前提是Temporal内部有定义
  newTemporal。TimeZone(AsiaShanghai);
  AsiaShanghai
  from同理
  Temporal。TimeZone。from(AsiaShanghai);
  AsiaShanghai
  在和其他类型搭配时,可以直接使用字符串(AsiaShanghai),或者Temporal。TimeZone对象
  例子:
  获取一个ZonedDateTime类型,设置时区时,使用Temporal。TimeZone对象。
  newTemporal。ZonedDateTime(0n,Temporal。TimeZone。from(AsiaShanghai));
  19700101T08:00:0008:00〔AsiaShanghai〕
  等价于
  newTemporal。ZonedDateTime(0n,AsiaShanghai));
  Calendar
  定义:负责Temporal的日历系统。
  例子:中国农历。不单独使用,结合其他类型搭配。获取一个Calendar类型
  同TimeZone类同,newCalendar(string)或者Temporal。Calendar。from(string)
  newTemporal。Calendar(chinese)。toString();
  chinese
  Temporal。Calendar。from(chinese)。toString();
  chinese
  Calendar类型不会单独使用,要配合其他带有日历属性的类型使用。
  如上所述,在Temporal里,包含日历属性的有plainXX系列和ZonedDateTime
  这两种类型的原型上有一个withCalendar的方法,用来设置该日期的日历属性。
  例子:
  plainXX系列添加日历属性
  没有添加日历属性前
  Temporal。PlainDate。from(20190206);
  20190206
  添加日历属性后
  Temporal。PlainDate。from(20190206)。withCalendar(chinese);
  20190206〔ucachinese〕
  ZonedDateTime添加日历属性
  没有添加日历属性前
  Temporal。ZonedDateTime。from(20220228T00:00:0008:00〔AsiaShanghai〕)
  20220228T00:00:0008:00〔AsiaShanghai〕
  添加日历属性后
  Temporal。ZonedDateTime。from(20220228T00:00:0008:00〔AsiaShanghai〕)。withCalendar(chinese)
  20220228T00:00:0008:00〔AsiaShanghai〕〔ucachinese〕
  Duration
  定义:表示一段持续时间,并且这段时间可以用来进行算术。
  使用场景:两段时间,一小时一分钟和一小时十分钟,可以转换Duration类型,再进行时间的长度比较,从而得知前者的时长小于后者。
  Duration并非像Date的时间戳形式那样表达一段时间,而是根据ISO8601表示法生成一个字符串来表达一段时间。
  简而言之,ISO8601表示法的首字母必须由P开头,后跟日期,年、月、周和日再由T字母进行分割,后跟时间,小时、分钟、秒。
  一个Duration字符串可以缺失年月周日小时分秒中的任意一个,但必须包含首字母P,如果同时有小时分秒,则必须包含字母T。
  举例:
  一年:P1Y,必须保留P,没有时间信息,不用加T来分割。
  一分钟:PT1M,必须保留P,有时间信息,则加T来分割日期和时间
  一些Duration的字符串表达练习
  获得一个Duration类型
  newTemporal。Duration()
  参数:年纳秒,全部可选,非必填。需要按照顺序输入,某单位空缺则输入undefined或者0。
  newTemporal。Duration(1,2,3,4,5,6,7,987,654,321);
  P1Y2M3W4DT5H6M7。987654321S
  中文翻译1年2月3周4天5小时6分钟7秒987毫秒654微秒321纳秒
  newTemporal。Duration(0,0,0,40);
  P40D中文翻译40天
  Temporal。Duration。from(undefined,undefined,undefined,40);
  P40D
  newTemporal。Duration();
  PT0S
  了解了Duration的字符串含义以及怎么生成一个Duration后,可以用其进行一些日期与时间的计算与运算。
  比对日期或时间的长度大小
  调用Duration原型上的compare方法。返回值:1,0,1
  oneTemporal。Duration。from({hours:79,minutes:10});PT1H10M
  twoTemporal。Duration。from({days:3,hours:7,seconds:630});P3DT7H630S
  Temporal。Duration。compare(one,two)
  1
  返回1,则one比two的时间短
  返回0,则one比two的时间一样
  返回1,则one比two的时间长
  事实上,除了Timezone和Calendar类型外,所有具备日期和时间属性的类型都可以进行算术
  如PlainDateTime类型:
  oneTemporal。PlainDateTime。from(19951207T03:24);
  twoTemporal。PlainDateTime。from(19951207T01:24);
  Temporal。PlainDateTime。compare(two,two)
  1
  日期或时间的加减运算。
  加法:
  Temporal。Duration。from(PT1H);PT1H
  hour。add({minutes:30});
  PT1H30M
  减法:
  hourAndAHalfTemporal。Duration。from(PT1H30M);PT1H30M
  hourAndAHalf。subtract({hours:1});PT30M
  同样,这些算术除了除了Timezone和Calendar类型外,其他类型都适用。
  如PlainDateTime类型:
  dtTemporal。PlainDateTime。from(19951207T03:24:30。000003500);
  dt。add({years:20,months:4,nanoseconds:500});
  20160407T03:24:30。000004Temporal类型之间的转换
  Temporal的各种类型,除了完成自身的功能外,还可以类型转换。
  再次回看这个类型关系图,左侧黄色区域的Instant类型,用来表达某个瞬间的时间,不包含时区和日历的信息。
  右侧黄色区域的PlainXX系列(5个),用来表达日历日期或者钟表时间,包含日历信息,而中间的ZonedDateTime则横跨左右两个区域,包含时区和日历信息,可以作为一个通道,连接左侧的Instant和右侧的Plain系列,负责类型之间转换的桥梁,同时中间的Timezone时区类型Calendar日历类型,不单独使用,配合上方的ZonedDateTime类型来辅助转换。
  最下面的Duration与所有类型没有直接关系,不参与类型转换,表示一段持续时间,并且这段时间可以用来进行算术。
  InstantZonedTimeDate
  转换前
  Temporal。Instant。from(20200805T20:06:130900)。toString()
  20200805T11:06:13Z
  转换后
  Temporal。Instant。from(20200805T20:06:130900)。toZonedDateTimeISO(AsiaTokyo)。toString();
  20200805T20:06:1309:00〔AsiaTokyo〕
  ZonedTimeDateInstant
  转换前
  Temporal。ZonedDateTime。from(20201101T01:4507:00〔AmericaLosAngeles〕)。toString();
  20201101T01:45:0007:00〔AmericaLosAngeles〕
  转换后
  Temporal。ZonedDateTime。from(20201101T01:4507:00〔AmericaLosAngeles〕)。toInstant()。toString();
  20201101T08:45:00Z
  ZonedTimeDatePlainDateTime
  转换前
  Temporal。ZonedDateTime。from(20201101T01:4507:00〔AmericaLosAngeles〕)。toString()
  20201101T01:45:0007:00〔AmericaLosAngeles〕
  转换后
  Temporal。ZonedDateTime。from(20201101T01:4507:00〔AmericaLosAngeles〕)。toPlainDateTime()。toString();
  20201101T01:45:00
  PlainDateTimeZonedTimeDate
  转换前
  Temporal。PlainDateTime。from(20200805T20:06:13)。toString()
  20200805T20:06:13
  转换后
  Temporal。PlainDateTime。from(20200805T20:06:13)。toZonedDateTime(AsiaTokyo)。toString();
  20200805T20:06:1309:00〔AsiaTokyo〕总结
  回到最开始Date的问题。
  1。不支持除用户本地时间以外的时区。Temparal支持开发人员通过TimeZone来设置本地时间以外的时区。
  2。计算API缺失。除了时区和日历类型外,其他类型都可以进行算术运算,即时间的比较,增加,减少等。
  3。不支持非公历,Calendar类型支持Temparal选择日历。
  4。解析器行为不可靠以至于无法使用,在Temporal里,new构造函数()或者From方法,对参数的要求都更加规范,同时From方法支持日期溢出后的逻辑处理,可以防止系统崩溃。
  最后附一张Temparal各种类型的功能对照图。每个类型负责Temparal哪些功能已经标注清楚。
  参考资料
  博客:https:tc39。esproposaltemporaldocs

适合13岁孩子看的绘本有哪些?这3本,每一本都很经典文婷妈哈喽,大家好,我是婷妈。今天有妈妈私信我,问我有哪些绘本适合13岁孩子看。很多妈妈都很重视孩子的早期阅读习惯培养,但是,他们在选择童书的时候又会充满困惑……谁才是驯龙高手,手机发热排行榜,小米确定为发烧而生?今年最尴尬的芯片厂商是高通,全球芯片份额被联发科超越,高端旗舰芯片又变成了火龙,无论是功耗还是发热都无法让人满意,为了驯龙,不少手机厂商都把自家的芯片降频。最开始小米为了释放骁……这些所谓的网红打卡地方,请不要再自欺欺人了今天还是想聊一聊虚幻的网络时间,我有段时间沉迷于在某乎看一个问题,照骗能骗到什么程度,怎么说呢,大开眼界。比如我们熟悉的李云龙能给P成这样:你以为漂亮的模特,其实她……1973年,伟人为何要对调八大军区司令?邓公主席真高瞻远瞩1973年12月,在毛主席的一声令下,原本在各自军区待了几十年的8个军区司令快速完成了对调。这一巨大的改变快速引起了世界各国的关注,对此众人猜测纷纷,甚至表示这将会是中国走向衰……大学物理实验二8。光电效应与普朗克常量的测量光电效应与普朗克常量的测量光电效应在证实光的量子性方面有着重要的地位。当光照射金属表面时,在某些情况下,有些电子可以从金属中释放出来,形成光电流。当照射在金属上的光的强度……英特尔收购威盛X86业务兆芯何去何从日前,英特尔公司以1。25亿美元收购威盛麾下Centaur公司的x86业务。Centaur是威盛的一家子公司,20多年前,威盛依靠数笔收购获得了x86授权,开发了数款X86芯片……86岁影星确诊肺癌,3个月后去世!医生这5类人肺癌高发著名影星因肺癌去世据新闻报道:香港演员谭炳文因病逝世,享年86岁。谭炳文是香港配音界的始祖人物,曾配音过《蓝精灵》《圣斗士星矢》《龙珠》《建元风云》《水浒传》《包青……人到晚年才会明白,活着就是活着,人生原来本无意义人到晚年才会明白,活着就是活着,人生原来本无意义。少年时,对人生懵懵懂懂,青年时不顾一切往前冲,中年时放佛清醒了许多,老年时一切已经看的云淡风轻。有时候人们忙碌一番后,偶然间脱……一年两送航天员入驻空间站将成为常态今年6月17日,神舟十二号三名航天员进入太空,实现太空驻留三个月。今天(10月16日),神舟十三号三名航天员再次飞天,将驻留太空六个月。有着神箭美誉的长二F火箭,首次实现了一年……戴珂从服务的角度看SaaS,我们能看到什么?本文由36氪企服点评专家团戴珂原创。36氪企服点评专家团戴珂正文在IT和互联网的产品开发和生产领域,从业人员已经饱和,所以IT行业才会出现35岁现象。事……果然有花样!当她在奥运会上拿出一个麻将,我就觉得这事并不简单在北京2022年冬奥会迎来开幕倒计时100天之际北京冬奥会奖牌同心正式亮相(详情见)奖牌由圆环加圆心构成形象来源于中国古代同心圆玉璧共设五环……快船惜败勇士,揪出三大罪人!没有伦纳德退出争冠行列快船113115惜败勇士,无缘赛季开门红!这场比赛他们是有机会拿下的,虽然开局挖坑,一度落后19分,但是凭借着乔治,布莱德索以及祖巴茨的发挥,他们将这个填平了。并且在最后还剩2……
Panadol退烧药怎么吃?Panadol退烧药用法Panadol退烧药是来自澳洲的神奇药品,很多人在澳洲生活过会力推这款退烧药,下面5号网的小编为你们介绍Panadol退烧药怎么吃?Panadol退烧药用法。Panadol退烧……30多岁患者,小腹胀痛,晚上容易醒,精神不好,眼睛感觉半夜容易起立,补的意义不大。你什么临床表现?感觉精神非常不好,然后睡觉好像也不是太好,就是眼睛感觉每天就很疲劳,小腹胀痛这些有吗?对对对,小腹胀痛有的。每次同完房,就是他一直挺……金品质立天下金立手机曾经的王者现在也只能苟延残喘的活着头条创作挑战赛你用的第一款手机是什么金品质立天下看到这个广告,大家是不是觉得很熟悉呢?刘德华的一句金品质立天下曾经让金立手机火遍了大江南北。讲到金立集团的发展历史,就不得不提到……卷土重来!AI概念再度活跃,游戏ETF(159869)今年来今日(4。11)市场整体上走出下跌修复行情。上午窄幅整理,临近午盘快速下行,很快在3300点附近止跌企稳,两点之后缓慢上行,基本修复了今天全部跌幅。截至收盘,沪指微跌0。……在线教育搭建网校才是上上策,一百分超越同行大象网盟教育的发展是以人为本,而在线教育就是为学员服务,全面的服务呈现出在线教育的多样性以及多元化的教育方式。在线教育驶入快车道,未来教育市场即将被在线教育市场占领,如此有吸引力的教育……卫生棉条和卫生巾哪个好?卫生棉条和卫生巾的区别在这样的炎炎夏日,带着一块卫生巾,真的是好热好闷,受不了!还好这个时候有卫生棉条,小小的棉条解决夏日里的小烦恼!卫生棉条和卫生巾哪个好?卫生棉条和卫生巾的区别是什么?卫生棉条……长期用不含氟牙膏好吗不含氟牙膏有什么好处牙膏是我们每天都会用到的一种生活用品,牙膏的种类有很多,含氟牙膏是很常见的一种牙膏,含氟牙膏有很多的好处,一般我们使用牙膏都推荐含氟牙膏。长期用不含氟牙膏好吗含氟的牙膏比……芝麻油的神奇妙用有哪些巧用芝麻油芝麻油是一种很常见的调料品,很多人都会用芝麻油来调菜品味道。那么,芝麻油的神奇妙用有哪些呢?芝麻油的神奇功效1、每晚睡前和早晨起床后喝半汤匙芝麻油,可以治支气管炎和便秘。……农业部怎样回应转基因食品?转基因的食物有哪些?随着科技的发展身边转基因的食物越来越多,坊间流传转基因会致癌,转基因的食物危害超过原子弹的杀伤武器等。这些是真的吗?农业部对此作出了回应。转基因会致癌有关转基因食品……下午察中国人与榴梿自由的距离还远吗?作者:察客两个有关榴梿的话题,最近登上了微博热搜榜。一个是泰国榴梿一公斤降价30元,另一个是可以榴梿自由了吗。对中国榴梿消费者来说,价格一直是他们关注的焦点。毕竟动……张家齐等奥运冠军在京参加义务植树活动新华社北京4月7日电(记者吴博文)7日,奥运冠军张家齐、施廷懋、王涵与国家跳水队、国家花样游泳队运动员、教练员一同来到国家植物园参加义务植树活动。活动现场,运动员们在聆听……塑料袋收纳妙招图解4个收纳小技巧买东西常常累积了许多塑胶袋,有大有小,干净的塑胶袋可以收纳物品,有点脏的塑胶袋用来装资源回收物品,都各有不同用途,只是每次都要从一堆塑胶袋中翻出需要的塑胶袋,真的很麻烦。跟着专……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网