有一个接受日期并进行一些处理的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构造函数。Date.toISOString()
来获取格式化为UTC的日期。Date.UTC
方法获得UTC午夜,从实验日期传入相关的getUTCFullYear()
,getUTCMonth()
,getUTCDay()
等。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());