我使用Moment.js在我的web应用程序中解析和格式化日期。作为JSON对象的一部分,我的后端服务器从UTC纪元(Unix偏移量)发送日期为毫秒数。
解析特定时区中的日期很容易——只需在解析前将RFC 822时区标识符附加到字符串的末尾:
// response varies according to your timezone
const m1 = moment('3/11/2012 13:00').utc().format("MM/DD HH:mm")
// problem solved, always "03/11 17:00"
const m2 = moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm")
console.log({ m1, m2 })
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
但是我如何在特定时区中格式化日期 ?
无论浏览器的当前时间如何,我都想要一致的结果,但我不想以UTC显示日期。
在Manto的回答中指出,.utcOffset()
是时刻2.9.0的首选方法。此函数使用UTC的实偏移量,而不是反向偏移量(例如,在DST期间-240表示纽约)。像"+0400"这样的偏移量字符串的工作方式与以前相同:
// always "2013-05-23 00:55"
moment(1369266934311).utcOffset(60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).utcOffset('+0100').format('YYYY-MM-DD HH:mm')
旧的.zone()
作为setter在Moment.js 2.9.0中已弃用。它接受一个包含时区标识符的字符串(例如,"-0400"或"-04:00"表示-4小时)或表示比 UTC晚分钟的数字(例如,纽约在DST期间为240分钟)。
// always "2013-05-23 00:55"
moment(1369266934311).zone(-60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).zone('+0100').format('YYYY-MM-DD HH:mm')
要使用命名时区而不是数字偏移量,包括Moment Timezone并使用.tz()
代替:
// determines the correct offset for America/Phoenix at the given moment
// always "2013-05-22 16:55"
moment(1369266934311).tz('America/Phoenix').format('YYYY-MM-DD HH:mm')
已经有几个回答提到moment-timezone是使用命名时区的方式。我只是想澄清一些关于这个图书馆让我很困惑的事情。这两个语句是有区别的:
moment.tz(date, format, timezone)
moment(date, format).tz(timezone)
假设在传入的日期中没有指定时区:
第一个代码接受日期,并假设传入的是时区。第二个将采用日期,假设浏览器中的时区,然后根据传入的时区更改时间和时区。
的例子:
moment.tz('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss', 'UTC').format() // "2018-07-17T19:00:00Z"
moment('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss').tz('UTC').format() // "2018-07-18T00:00:00Z"
我的时区是utc +5。因此,在第一种情况下,它不会改变,它设置日期和时间为utc时区。
在第二种情况下,它假设传入的日期是-5,然后将其转换为UTC,这就是为什么它吐出日期"2018-07-18T00:00:00Z"
注意:format参数非常重要。如果省略了moment,则可能会返回到Date类,从而导致不可预测的行为
假设时区是在传入的日期中指定的:
在这种情况下,它们的行为相同
虽然现在我明白了为什么它是这样工作的,但我认为这是一个相当令人困惑的特性,值得解释。
使用moment-timezone
moment(date).tz('Europe/Berlin').format(format)
在能够访问特定时区之前,您需要像这样加载它(或使用这里描述的替代方法)
moment.tz.add('Europe/Berlin|CET CEST CEMT|-10 -20 -30')
.zone()已弃用,您应该使用utcOffset:
// for a timezone that is +7 UTC hours
moment(1369266934311).utcOffset(420).format('YYYY-MM-DD HH:mm')
我在使用Moment.js时遇到了同样的问题。我已经安装了moment-timezone,但是这个问题没有解决。然后,我做了这里所曝光的,设置时区,它就像一个魅力:
moment(new Date({your_date})).zone("+08:00")
非常感谢!
刚刚遇到这个,因为我有同样的问题,我只是张贴我想出的结果
解析时,您可以更新偏移量(即我正在解析数据(1.1.2014),我只想要日期,2014年1月1日。在GMT+1,我会得到31.12.2013。所以我先偏移值
moment(moment.utc('1.1.2014').format());
好吧,这对我来说很方便,可以支持跨时区
B如果您的时间戳被"T"所分割,那么您必须首先使用utc方法。下面是我如何将时间戳从UTC转换为EST/EST:
let createdDate = moment.utc("2023-06-11T00:45:48.42")
moment(createdDate, "MM/DD/yy").tz("America/New_York").format("MM/DD/yy")}
结果是:06/10/2023
参考:https://momentjs.com/timezone/docs//using-timezones/
如果您将时间戳作为参数传递给moment()
(例如,如果时区是亚洲/香港,即+08:00),我所做的是:
const localDateTime = moment((item.createdAt.seconds + 8 * 3600) * 1000).format('YYYY-MM-DD HH:mm:ss');
你可以试试这个,
在这里你可以得到基于客户端时区(浏览器)的日期。
moment(new Date().getTime()).zone(new Date().toString().match(/([-+][0-9]+)s/)[1]).format('YYYY-MM-DD HH:mm:ss')
regex基本上是给你偏移值。
干杯! !