【问题标题】:Moment time difference won't use moment timezone but users computer time时刻时差不会使用时刻时区,但用户计算机时间
【发布时间】:2019-06-08 09:25:57
【问题描述】:

我正在尝试显示某事的持续时间标记。开始时间始终为伦敦时间。它非常适合英格兰/同一时区的人们,但是当其他时区的人们查看持续时间时,它会显示错误的值(如果您位于英格兰后面的时区 => 负值/太小值,则时区提前 = > 值太大)。

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

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 来使其工作。但这对我来说感觉不太正确。我更喜欢看起来不像黑客的解决方案。

【问题讨论】:

    标签: javascript angularjs momentjs moment-timezone


    【解决方案1】:

    您能否添加预期输出或指定“差异转换时间”的含义? 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});
    

    【讨论】:

    • 通过“转换时间”我的意思是,尽管指定我想要londonTimeNow 作为伦敦的时间(并且这个变量确实获得了伦敦的时间,即使对于美国用户也是如此),diff 函数似乎注意到时间与计算机本地时间有偏差,然后将其考虑在内。因此结果是它们的本地时间和 startTimeString(始终是伦敦时间)之间的差异给出了不正确的持续时间值。
    • 也谢谢您,我认为您将jobStartTime 设置为也有一个时区是正确的。它似乎有效,我只是要在确定之前进行更彻底的测试。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢,我会继续测试它,但这似乎有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多