如何使用moment.js在特定时区创建时间



我有一个后端,它在一个设置的时区中向我发送一个预先格式化的时间,但没有任何关于所述时区的信息。字符串类似于:"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,但在LA。

我想要的是创建一个实例,它将显示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");

有办法做到这一点吗?

在大多数情况下,您可以简单地执行以下操作:

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")

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

A) moment.tz.setDefault("America/Los_Angeles");

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

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

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

B) 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-时区/默认时区/

安装时刻时区

> npm install moment-timezone

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

.tz(字符串,字符串)

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

只是为了让一些东西非常清楚,这在其他答案中是隐含的,但没有真正说明:

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

当使用.tz(string datetime, [string format,] string zone)函数时,如果您希望将您给出的datetime参数解释为在您给出的zone中。如果省略format,请确保传递一个ISO8601格式的字符串


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

//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")

我希望这能为某人节省一些时间

我遇到了一个类似的问题,我必须使用纽约时间,所以我不得不考虑夏令时。我试着使用上面的几个答案,但没能奏效。然后我解决了我的问题,比如下面的代码

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')

或者以任何格式显示

您可以在初始化过程中设置时刻的时区,而无需直接使用.tz()函数,如next:

        moment = include();
        const someMomentObj= moment();
        const someOtherMomentObj = moment();
        const yourTimezone = 'Africa/Accra';
        const momentObj = moment(
            `${someMomentObj.format('YYYY-MM-DD')} ${someOtherMomentObj} ${yourTimezone}`,
            'YYYY-MM-DD HH:mm z'
        );

在这种情况下,"yourTimezone"常量将对应于"YYYY-MM-DD HH:MM-z"输入模板的"z"符号。和此同时,您不会更改初始化对象的时区,只需将其正确解析为输入值即可。

相关内容

  • 没有找到相关文章

最新更新