Re: [问题] 请问new Date有办法指定时区吗?

楼主: eight0 (欸XD)   2018-12-17 02:36:15
timestamp 的值,是从 1970-01-01 00:00:00 (UTC) 开始计算,
每过 1ms 就增加 1。也可以说是从 1970-01-01 开始,到取得该
timestamp 的时间点为止,所经过的时间“量”。
它和时区、locale time 是没有关系的。举例来说,一台电脑放在台湾,
一台放在英国,同时对两台电脑下达取得 timestamp 的命令,
所得到的值是相同的。
跟时区、locale time 有关的是“日期”。例如一个台湾人和一个英国人约好
12/17 早上八点通电话,若不确认时区,台湾人到早上八点打电话时,
英国人还在半夜睡觉。
反过来说,同一个 timestamp,用不同的时区换算成日期,所得到的结果也不同。
至于 JavaScript 中的 Date,它只是一个记录了 timestamp 的物件,
并没有储存时区资讯。虽然它有提供把 timestamp 转成日期的方法,
但都是采用系统时区或 UTC。
你的问题其实有两部份︰
第一个问题是︰如何将一个“日期”转换成一个 Date (timestamp),
并且指定转换时采用的时区?
※ 引述《taco2548 ([email protected])》之铭言:
: 想请问new Date()的时候有办法同时指定时区吗?
如果不打算支援IE8的话,使用日期字串即可︰
// 台湾的早上八点
new Date("2018-12-17T08:00:00+0800")
// 英国的早上八点
new Date("2018-12-17T08:00:00+0000")
格式可以参考︰
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
注意这两个值(timestamp 的值)是不同的,因为它们分别代表不同的“时间点”。
第二个问题是︰如何将 timestamp 转换成日期,取得 weekday,
并且指定转换时采用的时区?
: 确定是否为台湾时间星期日
Date 有提供把 timestamp 换算成 locale weekday 的方法︰
new Date(timestamp).getDay()
但这个方法换算时所采用的时区来自系统,不能指定。
要指定时区就只能手动换算了︰
new Date(timestamp + 8*60*60*1000).getUTCDay()
+8*60*60*1000 的意思是,在该 timestamp 的时间点,英国 (UTC) 还要再等
八个小时,他们的“日期”才会和台湾在该时间点的“日期” 相同。
Reference:
* MDN - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
缩︰https://is.gd/HaOfhJ
作者: cutekid (可爱小孩子)   2018-12-17 10:39:00
大推呀(Y), 总是可以从 eight0 大回复的文章里学到东西!
作者: JustinHere (良葛格)   2018-12-19 19:48:00
用个datatime library之类的,别自己算这类东西。除非不在意误差,不然日期时间处理是很复杂的。
作者: wotupset (wotupset)   2018-12-20 11:35:00
专业!

Links booklink

Contact Us: admin [ a t ] ucptt.com