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

Dan*_*ean 25 javascript timezone momentjs

我有这个后端,它在设定的时区发送给我一个预先格式化的时间,但没有任何关于所述时区的信息.字符串如:"2013-08-26 16:55:00".

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

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

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

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

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

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

由此产生的时间将是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");
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

Mat*_*int 30

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

moment.tz("2013-08-26 16:55:00", "America/Los_Angeles")
Run Code Online (Sandbox Code Playgroud)

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

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

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

moment.tz("8/26/2013 4:55 pm", "M/D/YYYY h:mm a", true, "America/Los_Angeles")
Run Code Online (Sandbox Code Playgroud)

  • @andi - moment.js 默认使用浏览器的时区并支持 UTC。[moment-timezone](http://momentjs.com/timezone/) 添加了对命名 IANA 时区的支持,如“America/New_York”。 (2认同)

tim*_*liu 6

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

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

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

let moment = require('moment');
require('moment-timezone');
moment.tz.setDefault("America/Los_Angeles");
Run Code Online (Sandbox Code Playgroud)

所有调用 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"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我想补充一点,虽然这会起作用,但不推荐。最好默认为 UTC 时间,并以 UTC 存储时间,并在必要时根据用户的时区转换为本地时间。它将使您免于许多头痛 - 不是全部,因为时区非常混乱。 (2认同)