我有这个后端,它在设定的时区内向我发送预先格式化的时间,但没有任何有关所述时区的信息。字符串如:“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");
有办法吗?
答案 0 :(得分:27)
在大多数情况下,您只需执行此操作:
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.tz("8/26/2013 4:55 pm", "M/D/YYYY h:mm a", true, "America/Los_Angeles")
答案 1 :(得分:4)
如果要计算特定时区内的所有内容,请使用
设置默认时区 A) 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”设置中创建时间,这与使用时不同:
B)moment.tz("2017-03-04 00:00", "America/Los_Angeles")
OR
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/
答案 2 :(得分:1)
> npm install moment-timezone
或者参见https://momentjs.com/timezone/docs/
moment.tz("2020-01-02 13:33:37", "Iran/Tehran")
答案 3 :(得分:1)
只是为了使某些内容非常清楚,其他答案中暗示了这一点,但并未真正说明:
...当使用 .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")
我希望这可以为某人节省一些时间
答案 4 :(得分:0)
我有一个类似的问题,我不得不使用纽约时间,因此我不得不考虑夏令时。我尝试使用以上几个答案,但无法正常工作。然后我解决了下面的代码之类的问题
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()
这将为您提供一个ISO字符串,您可以按以下方式使用
moment(date).local().format('dddd, MMM DD YYYY, hh:mm A')
或您想要显示的任何格式