【问题标题】:Convert Local Timezone time to UTC将本地时区时间转换为 UTC
【发布时间】:2019-05-31 10:00:20
【问题描述】:

我正在寻找一种在本地时间转换 Javascript 日期对象的方法,假设时区像 America/New_York:

2019-01-04T00:00:00.000Z

我想将此转换为UTC 中的日期对象。

2019-01-04T05:00:00.000Z

const timezone = 'America/New_York';
const localMidnight = new Date(Date.UTC(2019, 0, 4)) // 2019-01-04T00:00:00.000Z
moment.tz(localMidnight, timezone).utc().toDate()

这里仍然返回与输入 2019-01-04T00:00:00.000Z 相同的内容。

> m(localMidnight, 'America/New_York').tz('utc').toDate()
2019-01-04T00:00:00.000Z
> m(localMidnight, 'America/New_York').tz('UTC').toDate()
2019-01-04T00:00:00.000Z
> m(localMidnight, 'America/New_York').utc().toDate()
2019-01-04T00:00:00.000Z

【问题讨论】:

  • 这是你想要做的吗? stackoverflow.com/questions/10087819/…
  • 更新了,我试过了还是不行。
  • 试试new Date(2019,0,1).toGMTString()
  • new Date(2019,0,1).toISOString() 获取您发布的格式
  • 这个问题令人困惑 :-) 最后带有 Z 的日期字符串已经是 UTC,而不是本地的。您有实际的日期对象或字符串吗?为什么要使用 Date.UTC 来获取非 UTC 日期?实际的日期对象已经知道它的 UTC 时间,使用 .toISOString 来查看它。

标签: javascript date timestamp momentjs


【解决方案1】:

要达到预期效果,请使用以下选项

语法 - moment(date).tz(timezone).utc().format()

对于 format-YYYY-MM-DDTHH:mm:ss.SSSZ 使用 toISOString() 而不是 format()

const timezone = 'America/New_York';
const localMidnight = new Date(Date.UTC(2019, 0, 4))
console.log("newTime in utc",  moment(localMidnight).tz(timezone).utc().format())
console.log("newTime",  moment(localMidnight).tz(timezone).utc().toISOString())
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data.js"></script>

codepen - https://codepen.io/nagasai/pen/gZegqd?editors=1010

【讨论】:

  • 我收到“错误:Moment Timezone 没有 America/New_York 的数据。”。您的 localMidnight 不是本地午夜,除非主机设置为 UTC,new Date(Date.UTC(2019, 0, 4)) 会为 2019-01-04T00:00:00Z 创建一个日期。
  • @RobG,修复了由于缺少 moment-timezone-with-data js 文件而导致的错误
  • 您可以删除 moment-timezone.min.js。该代码仍然没有任何用处,new Date(Date.UTC(2019, 0, 4)) 为 UTC 午夜创建日期,而不是本地日期。使用 moment.js 的 .utc 方法意味着所有计算和方法都使用 UTC,默认输出格式是 ISO 8601。没有 moment.js 和使用 toISOString 你会得到完全相同的结果i> 代替。
【解决方案2】:

我认为您想要的是根据特定时区中的日期和时间创建一个日期,然后为 UTC 创建一个 ISO 8601 时间戳。

下面的评论应该足够了,但如果您需要更多帮助,请询问。

// Create a moment for midnight in America/New_York
var newYork = moment.tz("2019-01-04 00:00", "America/New_York");

// Create an ISO 8601 timestamp UTC
console.log(newYork.utc().format()); // 2019-01-04T05:00:00Z
<script type="text/javascript" src="http://momentjs.com/downloads/moment.min.js"></script>
<script type="text/javascript" src="http://momentjs.com/downloads/moment-timezone-with-data.min.js"></script>

请注意,调用 utc 会触发 UTC 模式,除了格式化为 ISO 8601 和 UTC 之外,它还有 side effects

【讨论】:

    【解决方案3】:

    似乎问题出在您创建的日期格式上,在此示例中,您可以看到 .toISOString() 在末尾添加了一个 Z,而对于 moment.tz 方法您需要从格式中删除该字母。

    这是一个在 'America/New_York' 中创建新日期并将时区更改为 UTC 的示例

    const timezone = 'America/New_York';
    const localMidnight = new Date(2019, 01, 04);
    
    console.log("Original time:")
    console.log(localMidnight.toISOString());
    
    console.log("Converted to UTC:");
    console.log(moment.tz(localMidnight.toISOString().slice(0, -1), timezone).utc().format());   
    <script type="text/javascript" src="http://momentjs.com/downloads/moment.min.js"></script>
    <script type="text/javascript" src="http://momentjs.com/downloads/moment-timezone-with-data.min.js"></script>

    【讨论】:

    • 我不知道你认为这是在做什么,但它似乎是错误的。我得到“原始时间:2019-02-03T14:00:00.000Z”,这是正确的,然后是“转换为 UTC:2019-02-03T19:00:00Z”,这是错误的,因为第一个字符串已经是 UTC。第二个只是移动了 5 个小时。纽约的等效时间是 2019-02-03T09:00:00.000-05:00。或者纽约 2019-01-04 开始时的午夜是 2019-01-04T05:00:00Z。
    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2018-07-27
    • 2011-03-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多