如何在node.js中设置默认时区

JavaScript035

如何在node.js中设置默认时区,第1张

经过试验,虽然设置process.env.TZ的方法不能用了,但我们完全可以自己实现一套代码出来。 

为此,我们首先在Date对象的prototype上声明一个map结构作为属性,用于存储时区名称和偏移量的关系,然后对Date类的Date方法进行修改,如果没有声明process.env.TZ变量,就默认返回原来的date对象,如果声明了该属性,就先到对应的数组中进行搜索,然后返回修改后的date对象。

process.env.TZ = "America/New_York"Date.prototype.TimeZone = new Map([

    ['Europe/London',0],

    ['Asia/Shanghai',-8],

    ['America/New_York',5]

])Date.prototype.zoneDate = function(){

    if(process.env.TZ == undefined){        return new Date()

    }else{        for (let item of this.TimeZone.entries()) {            if(item[0] == process.env.TZ){                let d = new Date()

                d.setHours(d.getHours()+item[1])                return d

            }

        }        return new Date()

    }

}var date = new Date().zoneDate()

console.log(date)

在上面的代码里,如果声明了process.env.TZ这一属性,再调用zoneDate就能得到对应时区的date啦

一直被各种时间格式困扰,所以这次来总结一下常用的时间格式到底有哪些,它们之间如何互相转换。

ISO Date "2015-03-25" 国际标准

Short Date"03/25/2015"

Long Date "Mar 25 2015" 或者 "25 Mar 2015"

Full Date "Wednesday March 25 2015"

new Date()方法可以将前四种时间格式当做参数,输出 UTC 格式的时间

UTC "2015-03-25T12:00:00" 看到日期和时间中间有一个字母 T 表示为 UTC 时间 是 现在使用的标准时间

UTC 是时间标准;ISO-8601 是表示时间的一种标准格式

ISO-8601 的具体日期的时间表示法,在 UTC 时间后加 Z,如 "2015-03-25T12:00:00Z",Z 表示是通用标准,其它的时区的时间和 UTC 不同,所以用实际时间加时差表示。

GMT Greenwich Mean Time "Mon Feb 13 08:00:00 GMT+08:00 2012" 中间有 GMT+ 字样

UTC(Universal Time Coordinated 原子钟提供)和 GMT (Greenwich Mean Time 格林尼治时间)一样

EDT (US)Eastern Daylight Time 东部夏令时

CDT (US) Central Daylight Time 中部夏令时

MDT (US)Mountain Daylight Time 山地夏令时

PDT (US) Pacific Daylight Time 太平洋夏令时

EST (US) Eastern Standard Time 东部标准时间

CST"Web Mar 25 2015 08:00:00 GMT+0800" 中部标准时间

MST (US) Mountain Standard Time 山地标准时间

PST (US) Pacific Standard Time 太平洋标准时间

设置时间时,没有指定 time zone,js 将会使用浏览器的 time zone

获取时间时,没有指定 time zone,结果将会转换成浏览器的 time zone

总之,如果时间是用 GMT 时间创建,如果浏览器 from central US 时间将会被转换成 CDT。

涉及到格式类型:UTC,GMT,unix timestamp

常规的时间处理直接使用 [dayjs](https://www.npmjs.com/package/dayjs) 库就可以满足了,大而全一些的就使用 [momnet.js](http://momentjs.cn/) 处理吧\n\ndayjs适合移动端或网站对时间处理没那么复杂的,比较轻量\n\nmoment.js是一个功能非常齐全的处理时间的类库,在PC站上使用比较合适,毕竟使用wifi比使用流量好多了,哈哈\n\n如果一般项目已经使用了dayjs,突然来个需求要处理utc时间转换,这时又不想再下载momnet.js,有以下两个方式可以处理\n\n### 一、手写\n\n```\nvar bjTimestamp = 1584027168\nvar localTimezoneMinutes = 420// 每个时区间隔1小时,转换为分钟就是60,420也就是东七区,60 * 7 = 420,而480就表示东八区转换为秒为28800\nvar localTime = dayjs((bjTimestamp + (localTimezoneMinutes - 480) * 60) * 1000).format('YYYY-MM-DD')\n```\n\n### 二、下载dayjs-plugin-utc扩展插件\n\nnpm安装地址:https://www.npmjs.com/package/dayjs-plugin-utc\n\n引入后直接使用utfOffset做时区偏移就行了\n\n```\nimport dayjs from 'dayjs'\nimport dayjsPluginUTC from 'dayjs-plugin-utc'\n \ndayjs.extend(dayjsPluginUTC)\n\n// 计算当地时间\nfunction calcLocalTime (bjTimestamp, localTimezoneMinutes, format) {\n if (bjTimestamp &&localTimezoneMinutes) {\n return dayjs(bjTimestamp * 1000)\n .utcOffset(localTimezoneMinutes)\n .format(format || \"YYYY-MM-DD HH:mm\")\n }\n return \"--\"\n}\ncalcLocalTime(1584027168, 420)\n```\n\n>补充介绍一下,utc时间,世界调整时,就是各个时区的时间不一样,像北京时间是8点,那东京时间就是9点,比我们多了一个时区。之所以要转换时间,是因为手机时间会根据时区自动调整,假如我们坐一个航班8点出发到东京2个小时,我们手机当时看是10点到达,如果你到了东京手机上显示的时间应该是11点到达。\n\n"