重置时区感知的时间戳momentjs

4
我正在使用momentjs进行日期操作,希望编写这样一种情况的代码:如果给定时间戳和时区名称,则将时间重置为午夜。例如:
let timestamp = 1493638245234;
expect(new Date(timestamp).toISOString()).toBe('2017-05-01T11:30:45.234Z'); // Time in UTC
let truncatedTimestamp = functionName(timestamp, 'America/Los_Angeles');
console.log(truncatedTimestamp); 
expect(new Date(truncatedTimestamp)).toBe('2017-05-01T04:00:00.000Z'); 


const functionName = (timestamp, timezone) => {
return moment
    .tz(timestamp, timezone)
    .startOf('day')
    .toDate()
    .getTime();
};

我希望函数'functionName'返回America/Los_Angeles时间的午夜而不是UTC时间。
我输入的时间戳是2017年5月5日上午11:30 UTC。我期望该函数返回2017年5月5日America/Los_Angeles的时间戳为00:00(因为2017年5月5日上午11:30 UTC将会是America/Los_Angeles时间的上午11:30 -7小时),并将其转换为毫秒。
2个回答

2
您需要移除使用本地时间的JavaScript日期对象的toDate()方法,然后可以使用valueOf()替代getTime()

moment#valueOf会输出自Unix纪元以来的毫秒数,与Date#valueOf类似。

您的代码可能如下所示:

const functionName = (timestamp, timezone) => {
  return moment(timestamp)
      .tz(timezone)
      .startOf('day')
      .valueOf();
};

let timestamp = 1493638245234;
let truncatedTimestamp = functionName(timestamp, 'America/Los_Angeles');
console.log(truncatedTimestamp); 
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.17/moment-timezone-with-data-2012-2022.min.js"></script>

请注意,moment.tztz() 在您的情况下是等效的(因为您传递了毫秒)。

1
我将我的函数functionName修改为以下内容,它可以正常工作。
const functionName = (timestamp, timezone) =>
    moment
        .tz(timestamp, timezone)
        .startOf('day')
        .valueOf();

注意:一些用户发布了这个答案,但他们删除了他们的答案。

我已经恢复了我的回答,抱歉暂时删除它。在发布答案后,我对代码有些疑虑,但我当时正在使用移动设备,检查的机会有限(时区的深夜也没有帮助:D)。 - VincenzoC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接