【问题标题】:Convert Javascript date to UTC with timezone information使用时区信息将 Javascript 日期转换为 UTC
【发布时间】:2017-11-02 08:14:48
【问题描述】:

我有一个允许用户创建事件的 UI。当用户创建此事件时,他们选择一个日期(和时间)并分别为事件位置选择一个时区(例如“America/New_York”)。

我需要使用日期(包括时间)和选定的时区(字符串)来创建 UTC 日期。我不知道该怎么做。

我曾考虑过使用 getTimezoneOffset,但这不会根据一年中的时间(英国夏令时等)而改变。

更新。我的解释不是很清楚,所以这里有更多细节:

用户选择事件的日期和时间是“2017 年 1 月 1 日 07:00:00”。 然后他们选择“America/New_York”的时区。它发生在纽约早上 7 点,但我在英国。

当我这样做时:

const formatDate = moment.tz( new Date('Jan 01 2017 07:00:00'), 'America/New_York' ).format(); //returns '2017-01-01T02:00:00-05:00'

如果我将纽约的这个日期转换为我的本地日期:

new Date( formatDate ); // returns 'Sun Jan 01 2017 07:00:00 GMT+0000 (GMT)'

我希望它返回本地日期和时间“Sun Jan 01 2017 12:00:00 GMT+0000 (GMT)”。

【问题讨论】:

  • 处理时区的唯一合理方法是地理标识符,例如“America/New_York”。
  • 你的意思是new Date().toISOString()? - 这将永远是 UTC
  • 没有“utcOffset”方法。 getTimezoneOffset 以分钟为单位返回主机偏移量,+ 表示西,- 表示东(与 ISO 8601 相反)。
  • 日期对象在内部是 UTC。它用于计算 UTC 时间值并使用非 UTC 方法生成“本地”值的主机偏移量。如果你想在任何时区得到一个相等的时间,把UTC时间调整到需要的量,然后使用UTC方法生成一个字符串,见Calculating a date and time in another time zone
  • 如果可以添加新库,您可以考虑使用moment.js。然后你只需使用 moment.utc(date).format() 将 JavaScript 的 Date 作为日期传递

标签: javascript date timezone momentjs utc


【解决方案1】:

来自docs

如果您想要一个实际时区 -- 特定位置的时间,例如 America/Los_Angeles,考虑moment-timezone

这表明 Moment.js 本身没有内置该功能,但应该由其他库完成:

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

请注意,您仍应将指定的时区存储在另一列中,因为无法从存储在 MySQL 中的日期中扣除它。

【讨论】:

  • 这与我想要的很接近,但并不完全。
  • 您没有遵循示例中的代码。一旦您插入文字 new Date('...') 调用,您就只能使用 JavaScript 日期 API,您将失去使用 Moment 的优势。
【解决方案2】:

最后我做到了:

const momentTimezone = require( 'moment-timezone' );
const DateWithOffset = require( 'date-with-offset' );

module.exports = function( date, timezone ) {

    const offset = momentTimezone.tz.zone( timezone ).offset( date );

    const newDate = new DateWithOffset( date.toUTCString(), ( 0 - offset ) );

    return newDate.toISOString();

};

可能有更好的方法来做到这一点,但这似乎有效。我使用了 npm 模块 date-with-offset 来完成所需的工作。

【讨论】:

  • 出于好奇,这是否意味着需要时刻时区但不提供全部功能?
猜你喜欢
  • 2021-03-12
  • 2014-06-13
  • 2017-11-07
  • 2016-06-17
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
相关资源
最近更新 更多