【问题标题】:Javascript - Convert a datetime, knowing its time zone, to UTCJavascript - 将知道其时区的日期时间转换为 UTC
【发布时间】:2021-03-01 19:13:06
【问题描述】:

我必须将给定时区、年、月、日、小时和分钟的日期时间转换为 ISO 字符串。

例如,给定以下参数:

{
 timeZone: 'Europe/Paris',
 year: 2020,
 month: 11,
 day: 18,
 hours: 14,
 minutes: 44,
}

我想建立对应的 ISO 字符串:2020-11-18T13:44:00.000Z(注意那里的小时班次)

您可以使用Intl.DateTimeFormattoLocaleDateString/toLocaleTimeString 方法很容易地以相反的方式执行此操作,但是这样我找不到合适的解决方案... 如果我忽略了任何信息来源,请告诉我。

编辑(见 cmets):

使用时区而不是 GMT 字符串(例如 'GMT +01:00')的好处是我不必处理时间更改。您可能知道,时区'Europe/Paris' 在冬天是'GMT +01:00',但在夏天是'GMT +022:00'...而且我找不到将时区映射到任何UTC 偏移量的正确方法

提前感谢您的帮助

解决方案

如下所示,使用 Luxon 我们可以做到

const timeObject = { day, month, year, hours, minutes, zone: timeZone };
const date = DateTime.fromObject(timeObject).toUTC().toString();

Matt 还提出了目前实验性的 Temporal 功能。

【问题讨论】:

  • Date 原型上的所有 UTC 方法怎么样?还有.toUTCString()?
  • 我无法使用此方法,因为我无法设置时区。执行此代码的服务器为 UTC 0,因此任何“new Date()”指令都将返回未转换的日期时间。我将得到一个未移位的 ISO 字符串(例如:2020-11-18T14:44:00.000Z 而不是 2020-11-18T13:44:00.000Z)
  • 你的问题说你有时区信息(“欧洲/巴黎”)。
  • 如果您可以将字符串时区信息映射到偏移量,您可以构建自己的包含偏移量的 ISO 字符串。然后就可以提取构造好的UTC版本了。
  • 这正是我的观点。使用 timeZone 而不是 GMT 字符串(例如 GMT +01:00)的好处是我不必处理时间更改。您可能知道,时区“欧洲/巴黎”在冬天是 GMT +1,但在夏天是 GMT +2……而且我找不到将时区映射到任何偏移量的正确方法

标签: javascript datetime timezone datetime-conversion


【解决方案1】:

使用Luxon(Moment 的继承者)。

// your input object
const o = {
  timeZone: 'Europe/Paris',
  year: 2020,
  month: 11,
  day: 18,
  hours: 14,
  minutes: 44,
};

// create a Luxon DateTime
const dt = luxon.DateTime.fromObject({
  year: o.year,
  month: o.month,
  day: o.day,
  hour: o.hours,
  minute: o.minutes,
  zone: o.timeZone
});

// convert to UTC and format as ISO
const s = dt.toUTC().toString();

console.log(s);
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/1.25.0/luxon.min.js"></script>

当然,如果您的输入对象使用与 Luxon 需要的相同的字段名称,您可以简化。

【讨论】:

  • 注意,如果这种情况最终被纳入 JavaScript 语言标准,Temporal 会更好地处理它。
  • 非常感谢!这是我最终要做的,分两行......我已经更新了我的问题。时空看起来很有趣地!再次感谢您的信息
【解决方案2】:

这是我的答案:

    var year = 2020;
    var month = 11;
    var day = 18;
    var hours = 14;
    var minutes = 44;
    var string = years + month + day + hours + minutes;

如果你想在输出中显示字符串:

    var year = 2020;
    var month = 11;
    var day = 18;
    var hours = 14;
    var minutes = 44;
    var string = years + month + day + hours + minutes;
    document.getElementById("demo").innerHTML = "time in string" + 
    string

【讨论】:

  • 这没有回答问题,我希望将 ISO 字符串转换为 UTC 时间。您不在这里处理时区。
猜你喜欢
  • 2016-06-17
  • 2019-03-24
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 2022-12-17
  • 2014-01-14
相关资源
最近更新 更多