38

我有这个后端,它在设定的时区向我发送预先格式化的时间,但没有关于所述时区的任何信息。字符串就像:“2013-08-26 16:55:00”。

我可以用这个字符串创建一个新的 moment.js 实例:

var time = moment("2013-08-26 16:55:00") //this creates time in my tz

但这只会在我自己的时区创建一个实例。

Moment.js 有一个插件,可以在特定时区创建对象的实例,效果很好,但我不能说我希望对象指向什么时间。

如果我在纽约并且我这样做:

var time = moment("2013-08-26 16:55:00").tz("America/Los_Angeles");

结果时间将是 13:55 而不是 16:55,但在洛杉矶。

我想要的是创建一个会说 16:55 的实例,但在洛杉矶时间。

我问的原因是因为我想这样做:

var now = moment.tz("America/Los_Angeles");
var end = moment("2013-08-26 16:55:00"); //plus something to convert LA time

var timeLeft = end.diff(now, "minutes");

有没有办法做到这一点?

4

5 回答 5

53

在大多数情况下,您可以简单地这样做:

moment.tz("2013-08-26 16:55:00", "America/Los_Angeles")

如果您需要 ISO8601 以外的输入,则将格式字符串指定为第二个参数,将时区指定为第三个参数:

moment.tz("8/26/2013 4:55 pm", "M/D/YYYY h:mm a", "America/Los_Angeles")

如果你需要使用 moment 的“严格解析”模式,那么就进入第三个参数,时区移动到第四个位置:

moment.tz("8/26/2013 4:55 pm", "M/D/YYYY h:mm a", true, "America/Los_Angeles")
于 2013-08-26T17:11:55.990 回答
6

如果要计算特定时区中的所有内容,则要使用设置默认时区

一个)moment.tz.setDefault("America/Los_Angeles");

对于我的用例(在 node.js 项目中),我只是在需要像这样的时刻模块之后立即设置它:

let moment = require('moment');
require('moment-timezone');
moment.tz.setDefault("America/Los_Angeles");

此后的所有调用都moment()将在“America/Los_Angeles”设置中创建时间,这与使用不同:

二)moment.tz("2017-03-04 00:00", "America/Los_Angeles")

或者

C)moment("2017-03-04 00:00").tz("America/Los_Angeles")

两者都会在 UTC 时间中创建时刻对象(除非您已经更改了默认值),然后将其转换为洛杉矶时区。

在浏览器控制台中运行上面的 B 或 C 会产生:

_d: Fri Mar 03 2017 16:00:00 GMT-0800 (PST)
_i: "2017-3-4 00:00"

通知 _d 显示 3 月 3 日下午 4:00;这是因为时刻对象是在 UTC 时间的 3 月 4 日凌晨 12:00 创建的,然后转换为太平洋时区,比前一天晚 8 小时。

来源: http: //momentjs.com/timezone/docs/#/using-timezones/default-timezone/

于 2017-03-05T07:50:03.853 回答
2

安装时刻时区

> npm install moment-timezone

或查看https://momentjs.com/timezone/docs/

.tz(字符串,字符串)

moment.tz("2020-01-02 13:33:37", "Iran/Tehran")

于 2020-05-23T10:56:26.887 回答
2

只是为了让一些事情变得非常清楚,这在其他答案中有所暗示,但并未真正说明:

  • 你绝对必须要么
    • 使用 ISO8601 作为您的日期格式或
    • 指定您的字符串的格式

.. 使用该.tz(string datetime, [string format,] string zone)函数时,如果您想将datetime您给出的参数解释为您给出的参数zone。如果省略format,请务必传递 ISO8601 格式的字符串


两天来,我转了一圈,因为我的 API 提供了一个时间字符串"03 Feb 2021 15:00",当然,它解析 OK,但它总是使用我本地机器上的时区,然后转换为我给的时区:

//this always resulted in "2021-02-03 10:00 EST" if run on a machine in UTC
moment.tz("03 Feb 2021 15:00", "America/Indianapolis").format("YYYY-MM-DD HH:mm z")

这非常令人困惑:解析显然工作正常,因为日期是正确的,但时间总是错误的,无论机器和给定区域字符串之间存在多少小时

切换到 ISO 格式输入有效:

//this always resulted in "2021-02-03 15:00 EST" if run on a machine in UTC
moment.tz("2021-02-03 15:00", "America/Indianapolis").format("YYYY-MM-DD HH:mm z")

正如声明:

//this always resulted in "2021-02-03 15:00 EST" if run on a machine in UTC
moment.tz("03 Feb 2021 15:00", "DD MMM YYYY HH:mm", "America/Indianapolis").format("YYYY-MM-DD HH:mm z")

我希望这可以节省一些时间

于 2021-02-03T21:32:32.160 回答
1

我有一个类似的问题,我不得不使用基于纽约的时间,所以我不得不考虑夏令时。我尝试使用上述几个答案,但无法使其正常工作。然后我解决了我的问题,如下面的代码

import moment from 'moment-timezone'

const time = timestamp
const offset = moment.tz.zone('America/New_York')?.parse(time)
const date = moment(time).add(offset, 'minutes').toISOString()

或者您可以这样做,当您在本地显示时会自行考虑时间偏移。

const time = moment.tz(timestamp, 'America/New_York')
const localtz = moment.tz.guess()
const date = time.clone().tz(localtz)

这为您提供了一个 ISO 字符串,您可以按如下方式使用它

moment(date).local().format('dddd, MMM DD YYYY, hh:mm A')

或以您想要显示的任何格式

于 2020-09-01T10:59:30.277 回答