【问题标题】:Momentjs how to convert a time string correctly to time offset since "utc start of current day"Momentjs如何将时间字符串正确转换为自“当天的UTC开始”以来的时间偏移
【发布时间】:2019-09-09 10:08:19
【问题描述】:

好吧,我有一个时间字符串,例如“06:00:00+00”和“06:00:00+01”,我希望将它们转换为文字以显示当前偏移量为“UTC 零”。

我试过的代码:

const v="06:00:00+00"
const fmt = "hh:mm:ss Z"
const m = moment(v, fmt).diff(moment(v, fmt).startOf('day'));
console.log(m);
console.log(m/(3600*1000));

但是,这会记录“8 小时”。 - 好像它使用我当地的时区。 - 尝试删除时区参数fmt = "hh:mm:ss" 使其忽略时区。

那么我该如何实现呢? (是的,这意味着整数可能是负数,如果 utc 尚未在指定日期内)。

【问题讨论】:

  • 调整时如果日期发生变化怎么办?
  • @AyushGupta 你是什么意思?正如我所说,例如,如果我在 utc-11 并且当前时间是“01:00:00-11”,我希望 -10*3600*1000 作为结果。
  • moment().utc(v, fmt).diff(moment().utc(v, fmt).startOf('day'));
  • @Ashok 使用v=06:00:00+1 进行的测试显示最后一个日志为“6”,而我预计为“5”。
  • v=06:00:00+1 不是正确的时区,它应该是 v=06:00:00+01 或 v=06:00:00+01.00 请检查我的答案跨度>

标签: javascript time momentjs


【解决方案1】:

与 UTC 比较的核心 JS 解决方案:

function getTimeDiff(timeString) {
  let curDate = new Date().toISOString().split('T')[0];
  return (new Date(`${curDate}T${timeString}00`).getTime() - new Date(`${curDate}T00:00:00Z`).getTime())/(3600 * 1000);
}

console.log(getTimeDiff("06:00:00+01"));
console.log(getTimeDiff("06:00:00-07"));
console.log(getTimeDiff("20:00:00-07"));

【讨论】:

  • 虽然使用core JS很整洁,但在重新发明轮子的过程中存在很多麻烦点。例如,上面的内容不适用于没有整数偏移量的时区。 (即:印度 +05:30)。然后是Z等特殊指标;出于这个原因,我认为使用库更好。
【解决方案2】:

这是从 moment() 中使用 utc() 的解决方案

const v="06:00:00+00"
const fmt = "hh:mm:ss Z"
const m = moment(v, fmt).diff(moment().utc(v, fmt).startOf('day'));
console.log(m/(3600*1000)); -> 6

有时区

// Here is time zone +01.00 
const v="06:00:00+01.00"
console.log(m/(3600*1000)); -> 5

// Here is time zone -01.00 
const v="06:00:00-01.00"
console.log(m/(3600*1000)); -> 7

对于像 UTC+08:45 这样的国家/地区,您需要注意分母。

【讨论】:

  • @paul23 请将您的 Moment 版本从 2.2.1 更新为 ^2.24.0 并告诉我。谢谢
猜你喜欢
  • 2022-06-27
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
相关资源
最近更新 更多