其实做起来一点也不难,但肯定不是凭直觉就能得出解决方案的。这里有一些非常复杂的答案(尽管也有一些不错的答案)。下面是我为确保我的服务器时间戳与我的本地时间戳匹配而提出的方法,无论我部署的服务器恰好位于哪个时区。
(CET =中欧时区,正好是我个人的时区;你可以得到任何给定时区的偏移量并计算它,如果你愿意,甚至可以把它作为一个参数,但对于我的目的,我只需要让我的日期都是所需的一致时区。)
const convertDateToCET = function(date) {
date = new Date(date)
// let startTime = date.getTime();
const cetOffset = -120; // this is the number you get from running
// `(new Date()).getTimezoneOffset()` if you're on a machine in CET
const offsetFromCET = (date.getTimezoneOffset() - cetOffset);
const cetMillsecondOffset = ( cetOffset* 60 * 1000);
date = new Date( date.getTime() - cetMillsecondOffset )
// let endTime = date.getTime()
// console.log("updated date from",startTime,"to",endTime)
return date;
},
用这个短语,你可以按照你所期望的方式来定一个时间。
let myDate = new Date("12-4-2021")
myDate.setHour(14)
myDate.setMinute(30)
// now myDate is 2:30pm, December 4th, 2021, in whatever the timezone the machine of code running happens to be in
myDate = convertDateToCET(myDate)
// now myDate will show up as 2:30pm, Dec 4th, 2021, mapped into your local timezone
// so, if you're in the UK, and one hour behind CET, myDate is now 1:30pm, Dec 4th, 2021
这里的关键是date.getTimezoneOffset()。如果你参加了四六级考试,那么这个数字就是-120,这样就消去了,没有区别(所以四六级考试的结果就是四六级考试的结果)。如果你在英国,比CET晚一小时,那么输出将是-60,这意味着-60 + 120 = +60,这导致我们将输入时间改变一小时,以此类推。
对于这种情况,转换所有内容并使用UTC可能更有意义,但考虑到我的所有输入时间都是使用CET,而且我最初是根据机器上的本地情况开发系统的,因此这个实用程序允许我通过在几个关键位置调用这个函数来转换现有代码。
注意:请确保不要在同一日期多次应用此函数调用,因为您将多次重新应用偏移量,将其抛出!