重置时区感知时间戳记

时间:2018-07-25 21:54:36

标签: javascript ecmascript-6 momentjs moment-timezone

我正在使用momentjs进行日期操作,并且想要编写一个方案,如果给出了时间戳,给出了时区名称,那么我想将时间重置为午夜。例如。

.kids

我希望函数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'时间的午夜,而不是UTC。

我输入的时间戳记是UTC时间2017年5月5日上午11:30。 我希望该函数返回我2017年5月5日00:00 America/Los_Angeles的时间戳(自2017年5月5日上午11:30 UTC将是America/Los_Angeles中的11:30 AM -7小时。)并进行转换到毫秒。

2 个答案:

答案 0 :(得分: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 :(得分:1)

我修改了我的函数functionName,使其生效。

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

注意:某些用户发布了此答案,但他们删除了答案。