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 日 00:00 的时间戳America/Los_Angeles(自 2017 年 5 月 5 日上午 11:30 起,UTC 将是 11:30 AM -7 小时America/Los_Angeles。)并将其转换为毫秒。

4

2 回答 2

2

您必须toDate()使用本地时间删除提供 JavaScript 日期对象的内容。然后你可以使用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.tz并且tz()在您的情况下是等效的(因为您传递的是毫秒)。

于 2018-07-25T22:06:32.093 回答
1

我将我的函数 functionName 修改为这样并且它起作用了。

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

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

于 2018-07-25T22:31:53.283 回答