时刻时差不会使用时刻时区,而是用户计算机时间

Moment time difference won't use moment timezone but users computer time

我正在尝试显示某项内容的持续时间代码。伦敦时间的开始时间是 always。它非常适合 England/the 同一时区的人,但是当其他时区的人查看持续时间时,它会显示错误的值(如果你在英格兰后面的时区 => 负 values/too 小值, 时区提前 => 值太大)。

我的解决方案是使用 moment-timezone。我正确地添加了时刻时区数据我试图使用这个时区数据(代码简化并分成单独的行以便于阅读):

let londonTimeNow = moment().tz('Europe/London'),
jobStartTime = moment(job.start, 'DD/MM/YYYY HH:mm:ss'),
diff = londonTimeNow.diff(jobStartTime);
duration = moment.duration(diff).format('HH:mm:ss', {trim: false});

我希望这会得到伦敦的当前时间,并与开始时间进行比较,无论您身在世界何处。但是,diff 函数似乎将时间转换为用户的计算机时间。我尝试将 londonTimeNow 格式化为字符串,但 diff 函数不起作用。 请注意,我已经调试并且 moment().tz() 工作正常,我已经尝试使用其他时区并在指定的时区获得正确的时间。

有什么想法吗?

编辑: 看来我可以通过手动将 'londonTimeNow' 的偏移量 属性 设置为 0 来使其工作。但是,这对我来说不太合适。我更喜欢看起来不太像 hack 的解决方案。

您能否添加预期的输出或指定 'diff converts the time' 的含义? diff 的结果是一个持续时间,不在任何时区。

除此之外,问题似乎出在任务启动时没有使用时区。 试试这个:

let londonTimeNow = moment().tz('Europe/London'),
jobStartTime = moment(job.start, 'DD/MM/YYYY HH:mm:ss').tz('Europe/London'),
diff = londonTimeNow.diff(jobStartTime);
duration = moment.duration(diff).format('HH:mm:ss', {trim: false});

您应该使用与使用相同时区声明伦敦时间相同的方式来指定作业开始时间:

jobStartTime = moment.tz(jobStart, 'DD/MM/YYYY HH:mm:ss','Europe/London'),

这将使用相同的时区设置作业开始时间。