如何在 momentjs 中将时区添加到特定格式?

How to add time zone to specific format in momentjs?

我正在尝试获取带时区的特定格式的日期时间

我正在获取如下所示的时间格式字符串

var dateTime = "2020-06-01T01:50:57.000Z CDT"

我需要将格式转换为

 const offsetTime = moment(date).add("-0.00", 'hours')
 const formatedDate = moment(offsetTime, 'h:mm:ss A')
.utc()
.format('h:mm A')//(1:50 AM)

需要输出

(1:50 AM CDT)

我是否需要拆分字符串并获取格式,或者我们是否有任何方法可以在 momentjs 中将其转换为这种格式

简单来说

YYYY-MM-DDTHH:mm:ss.SSS[Z] z To hh:mm A z //format

如果字符串只包含 2 个字符,例如 "CT" 而不是 CDT 如何捕获它。

您可以zz在输出中获取时区。例如: moment()..format('h:mm A zz')

此处有更多文档 momentJS

使用moment-timezone来实现。使用 moment 构造函数指定输入格式,然后指定所需的时区。最后使用moment的format得到需要的格式

var dateTime = "2020-06-01T01:50:57.000Z CDT";
var timezone = "America/Chicago";
console.log(
  moment(dateTime, "YYYY-MM-DD hh:mm:ss zz")
.tz(timezone)
.format("h:mm A zz")
);
<script src="https://momentjs.com/downloads/moment.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data-2012-2022.min.js"></script>

您的日期字符串是 ISO 格式,秒后的 'Z' 表示它是 UTC 时间。我假设 'CDT' 放在字符串中以指示应将其转换为哪个时区。如果您可以控制此字符串的表示方式,那么我建议您更改它,以便您在其他地方指示所需的时区并简单地以 UTC 格式存储日期。这样您就可以使用 ISO 字符串初始化日期或时刻对象,如下所示:

var date = moment("2020-06-01T01:50:57.000Z")

目前的方式很不方便,因为您无法以这种方式初始化它:

var date = moment("2020-06-01T01:50:57.000Z CDT")

处理当前形式的日期的唯一选择是解析它。你可以这样做:

var dateTime = "2020-06-01T01:50:57.000Z CDT"
var trimmed = dateTime.trim()  // remove leading and trailing whitespace
var isoString = trimmed.substr(0, trimmed.indexOf(' '))

这将产生以下字符串

2020-06-01T01:50:57.000Z

您可以使用我称为 "isoString" 的字符串来初始化日期或时刻对象。下一个障碍是处理将该 UTC 字符串转换为特定时区(在本例中为 CDT)。如果您想将 UTC 日期转换为当前用户时区,这很简单,因为当您使用 ISO 日期字符串初始化时刻或日期对象时,这将自动发生。否则,您需要一些方法将时区从 'CDT' 转换为 @vjr12 ("America/Chicago") 显示的时刻想要的格式。执行此操作的唯一方法是将其与日期字符串一起存储或创建映射。从 "America/Chicago" 转换为 "CDT" 比从 "CDT" 转换为 "America/Chicago" 容易得多。当前表单的唯一选择是创建您自己的从 "CDT" 到 "America/Chicago" 的映射。你可以这样做:

let tzMap = new Map()
tzMap.set('CDT','America/Chicago')
// Set the rest of your timezones

您需要为所有时区执行此操作,然后您可以像这样使用从日期字符串解析的时区:

var tzAbbr = trimmed.substr(trimmed.indexOf(' ') + 1)

这将抓住 "CDT" 或 "CT"。然后你可以像这样使用你的映射:

var timezone = tzMap.get(tzAbbr)
在这种情况下,

时区将为 "America/Chicago",然后您可以使用此处的 @vjr12 解决方案来获取您想要的表格。

备注

我强烈建议(如果可以的话)更改您正在使用的日期字符串的当前格式。使用 UTC 时间的目的是与时区无关,因此使用 UTC 字符串存储时区没有意义。如果您想保留时区,那么最好使用已经嵌入时区的格式。