nodejs 您所在的位置:网站首页 地球各个时区 nodejs

nodejs

2023-12-01 00:22| 来源: 网络整理| 查看: 265

背景我们基于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 实验室设备网 版权所有