Javascript -强制新的Date构造函数将参数视为UTC



有一个接受日期并进行一些处理的API端点。我确实通过邮差给出UTC日期(以末尾的Z表示)。从Postman发送的样本输入。

{
"experimentDate":"2022-01-12T12:30:00.677Z", 
}
在代码中,当我执行 时
let startDate = new Date(experimentDate);
//other calculations e.g get midnight of the startDate
startDate.setHours(0,0,0,0);

第一个赋值设置startDate更正为当前时区。因此,我的其他计算都出错了。例如,当我使用setHours函数将时间设置为0时,我希望它是在给定的UTC时间的午夜,但它会到我当前时区的午夜。如果在日期的末尾有一个Z,那么new Date应该不保留UTC的日期吗?

我应该像下面这样重新转换为UTC吗?这不是多余的吗?

Date.UTC(startDate.getUTCFullYear(), startDate.getUTCMonth(),
startDate.getUTCDate(), startDate.getUTCHours(),
startDate.getUTCMinutes(), startDate.getUTCSeconds())

实现这一目标的正确方法是什么?

Date对象将被存储为UTC日期,但是它上面有不同的方法可以设置/获取UTC和本地时区的日期或时间。尝试使用.setUTCHours(),而不是.setHours()

您可以使用Date构造函数来解析所提供的时间戳。

大多数方法将日期视为本地时间。例如,getHours()方法根据本地时间返回指定日期

的小时。但是,您可以使用getUTCXXX()方法来获取UTC日期组件,如年,月,日期,小时等。

您也可以使用Date.toISOString()来获取格式化为UTC的日期。

您可以使用Date.UTC方法获得UTC午夜,从实验日期传入相关的getUTCFullYear(),getUTCMonth(),getUTCDay()等。

然后可以将其传递给Date构造函数。

let timestamp = "2022-01-12T12:30:00.677Z";
const experimentDate = new Date(timestamp);
const midnightUTC = new Date(Date.UTC(experimentDate.getUTCFullYear(), experimentDate.getUTCMonth(), experimentDate.getUTCDate()))
console.log('Experiment date (UTC): ', experimentDate.toISOString());
console.log('Midnight (UTC):        ', midnightUTC.toISOString());

您也可以使用Date.setUTCHours()来做同样的事情。

let timestamp = "2022-01-12T12:30:00.677Z";
const experimentDate = new Date(timestamp);
const midnightUTC = new Date(experimentDate);
midnightUTC.setUTCHours(0,0,0,0);
console.log('Experiment date (UTC): ', experimentDate.toISOString());
console.log('Midnight (UTC):        ', midnightUTC.toISOString());