使用moment.js格式化日期时间以显示时区

7

我有一个使用moment.js显示时区的问题。

我尝试了以下代码:

var result = moment(someDate).format("MM/DD/YYYY HH:mm A Z");

我收到返回值,例如:08/05/2015 06:18 PM +02:00,这很好,但我想我的输出格式是 08/05/2015 06:18 PM WEDT 或类似的带有时区缩写的格式。

我尝试使用以下代码,但是最后得到了一个空的时区:

var result = moment(someDate).format("MM/DD/YYYY HH:mm A z"); 

或者

var result = moment(someDate).format("MM/DD/YYYY HH:mm A zz");

更新

正如@Matt Johnson建议的那样,我使用了这种方法来使用moment-timezone-with-data.jstzdetect.js显示时区:

var tzName = tzdetect.matches()[0];
var result = moment.tz(myDate, tzName).format("MM/DD/YYYY h:mm A zz");
2个回答

12

文档所述:

注意:从1.6.0开始,z / zz格式标记已被弃用。在此处阅读更多信息。

一般问题是,浏览器不能通过一致的API获取时区缩写。为了提供它们,必须有外部数据源。

您可能想要考虑使用moment-timezone插件。它提供时区信息,包括缩写。您需要知道正在使用的特定时区。例如:

moment.tz("2015-08-05T00:00:00+01:00", "Europe/London").format("MM/DD/YYYY hh:mm A z");
// "08/05/2015 12:00 AM BST"

此外,您不应将 HH(24小时制的小时数)与 A(12小时制的上午/下午标识符)混合使用。请使用带有 Ahh 或不带 AHH


感谢您的解释,我正在阅读您在这里的另一个答案:https://dev59.com/EV4c5IYBdhLWcg3wD2nC#28377706,我认为我可以将这两种方法结合起来以获得我所需的。 - freshbm
谢谢,我忘记了那个。 :) - Matt Johnson-Pint

2

将UTC日期时间转换为用户当前时区的解决方案是使用moment-timezone而不是moment。(我们在数据库中所有日期都是UTC时间)。其他时区也不应该是问题。

const timeZoneString = Intl.DateTimeFormat().resolvedOptions().timeZone
const getFormattedDateTimeWithTZ = (date) => {
      return moment((date)).tz(timeZoneString).format('ddd, MMM DD YYYY, h:mm A zz')
}
// outputs Tue, Mar 08 2022, 4:00 PM PKT
getFormattedDateTimeWithTZ('2022-03-08T03:00:00.000-08:00')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接