nodejs | 您所在的位置:网站首页 › 地球各个时区 › nodejs |
背景我们基于node搭建了bff中间层,做接口聚合、转发。一个接口需要传入当天0-23点获取对应数据。 new Date(new Date().setHours(0, 0, 0, 0)).getTime() 卡卡一顿获取上线,测试那面说数据有时间差,为啥呢我获取时间没问题啊。网上查了一下有说8小时,那只能打印看看结果了。 测试结果,我选取的时间 2023-01-06 00:00:00 时间戳: 本地时间戳:1672934400000 服务器时间戳:1672963200000 一比较确实是相差8小时 简单说,因为本地时区和服务器的时区不一样,差了8个小时导致 1.什么是时区 由于地球很大,每个地方经历的昼夜都不一样。 而大家又习惯于时间和昼夜的对应关系,比如正午就是12点 但是如果全球用一个时间,就会完成有一些国家的正午12点是大半夜。这样就不符合人们的作息习惯了。 从而分出了时区的概念,让时间相对统一,而不是绝对统一 2.时间分了什么时区 在1884年的华盛顿国际会议上,把全球划分为了24个时区,零时区,东12个区,西12个区,每个区相差1个小时 一般概念是这么按时区去计算时间,但是实际上,有的国家国土通常横跨几个时区,所以最后是以国家为纬度计算,比如大中国横跨5个时区,还是只共用一个时区。即东8区,北京时间 其中有个零时区,他的位置在英国(格林尼治天文台旧址) 3.时区的时间标准 因为时间是相对统一的,所有时区的时间都是相对于零时区得出的,那么就需要一个格式去表示 时间标准 有两种, UTC 和 GMT UTC 是我们现在用的时间标准,GMT是老的时间计量标准。 UTC 是根据原子钟来计算时间, GMT是英国格林尼治天文台观测太阳每天经过它的时间就是中午12点 所以能看到GMT根据地球自转来计算时间,肯定有误差,并且自转时间不可控,可能快一点可能慢一点,所以我们会采取更加精准的UTC UTC主要是各个时区相对于零时区加上 时间偏移量 UTC偏移量的表示形式为:±[hh]:[mm]、±[hh][mm]或者±[hh] 比如北京时间比协调世界时(UTC)早八小时,那么表示为:UTC+8 我们的时间 = 零时区时间 + 8个小时 5.怎么知道是什么时区 在JavaScript中当然提供了一个对象 Intl,他可以提供精确的日期格式化,数字格式化 等 今天我们只用他的一个api获取时区 Intl.DateTimeFormat().resolvedOptions().timeZone复制 在控制台执行一下,可以看到输出 Asia/Shanghai复制 咦,为什么是上海,不应该是北京吗 原因是1949年以前,中国一共分了5个时区,以哈尔滨 ( Asia/Harbin)、上海(Asia/Shanghai)、重庆(Asia/Chongqing)、乌鲁木齐(Asia/Urumqi)、喀什(Asia/Kashgar)为代表——分别是:长白时区GMT+8:30、中原标准时区 GMT+8、陇蜀时区GMT+7、新藏时区GMT+6和昆仑时区GMT+5:30。它是1912年北京观象台制订,后由内政部批准过。而且从国际标准本身的角度来看,北京和上海处于同一时区,只能保留一个。而作为时区代表上海已经存在,并且足够具有代表性,因此其维护者没有足够的动力做出改变。所以目前还没有Asia/Beijing。 然后我们在服务器打印一下时区,则显示 UTC 好家伙,果然是时区不对,所以时区不同,不能直接计算的 6.时间怎么转换时区 比如我当前有一个北京时间,我怎么知道他对应的美国时间是多少呢 同一个时间戳在 不同时区 对应的 时间是不一样的 所以我们需要转换一下 Date.prototype.toLocaleString( [locales [, options] ] )复制 该方法可以根据你设定的 语言 和 时区 来给你返回对应的 时间 如果是你什么都不传,默认就是你所在的时区 如果你是我大中国时间,想看看对应的美国时间是多少,可以这么设置 timeZone new Date().toLocaleString("chinese",{ hour12:false, timeZone:"America/New_York" })复制 如下图,可以看到差了12 个小时 相关的时区有 "Asia/Shanghai" ,"Asia/Kolkata", "America/New_York" 等 7.我的处理方案 为了后续更好的处理关于时间的使用,我在项目中使用了day.js import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import timezone from "dayjs/plugin/timezone"; dayjs.extend(utc); dayjs.extend(timezone); ... console.log( dayjs.tz(dayjs().startOf("date").format("YYYY-MM-DD HH:mm:ss"), "Asia/Shanghai").valueOf(), dayjs.tz(dayjs().endOf("date").format("YYYY-MM-DD HH:mm:ss"), "Asia/Shanghai").valueOf(), "当前时间",);day.js的使用方法参考文档 dayjs.fenxianglu.cn/ |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |