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

Javascript 如何在momentjs中将时区添加到特定格式?,javascript,momentjs,moment-timezone,Javascript,Momentjs,Moment Timezone,我正在尝试获取带有时区的日期时间的特定格式 我得到的时间字符串格式如下所示 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:5

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

我得到的时间字符串格式如下所示

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()…格式('h:mm A zz')


这里有更多文档

使用
时刻时区
来实现这一点。使用矩构造函数指定输入格式,然后指定所需的时区。最后使用矩的
格式
获得所需的格式

var dateTime=“2020-06-01T01:50:57.000Z CDT”;
var timezone=“美国/芝加哥”;
console.log(
时刻(日期时间,“YYYY-MM-DD hh:MM:ss zz”)
.tz(时区)
.格式(“h:mm A zz”)
);

您的日期字符串是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(' '))
var tzAbbr = trimmed.substr(trimmed.indexOf(' ') + 1)
var timezone = tzMap.get(tzAbbr)
将生成以下字符串

2020-06-01T01:50:57.000Z
您可以使用我称为“isoString”的字符串来初始化日期或时刻对象。下一个障碍是如何将UTC字符串转换为特定时区(在本例中为CDT)。如果您想将UTC日期转换为当前用户时区,这很简单,因为当您使用ISO日期字符串初始化时刻或日期对象时,将自动进行转换。否则,您需要某种方法将时区从“CDT”转换为@vjr12(“America/Chicago”)显示的所需格式。唯一的方法是使用日期字符串存储该字符串,或者创建映射。从“美国/芝加哥”转换为“CDT”要比从“CDT”转换为“美国/芝加哥”容易得多。使用当前表单的唯一选项是创建您自己的从“CDT”到“America/Chicago”的映射。你可以这样做:

let tzMap = new Map()
tzMap.set('CDT','America/Chicago')
// Set the rest of your timezones
您需要对所有时区执行此操作,然后可以使用从日期字符串解析的时区,如下所示:

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(' '))
var tzAbbr = trimmed.substr(trimmed.indexOf(' ') + 1)
var timezone = tzMap.get(tzAbbr)
这将抓住“CDT”或“CT”的问题。然后您可以像这样使用映射:

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(' '))
var tzAbbr = trimmed.substr(trimmed.indexOf(' ') + 1)
var timezone = tzMap.get(tzAbbr)
在本例中,时区将是“America/Chicago”,然后您可以从这里使用@vjr12解决方案来获取所需的表单

注意


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

使用您必须创建的时间字符串“new Date(您的字符串);”创建日期对象,然后从日期对象开始,您有许多附加功能,可以让您做您想做的事情:momentjs有什么功能吗?这是否回答了您的问题?我需要的是字符串,我得到的是时区,所以在格式化之后,我需要它是这样的(1:50 am CDT)为什么我们要提到.tz()?我们如何动态传递它我只是得到字符串“2020-06-01T01:50:57.000Z CDT”基本上是在给定的时区进行解析。我同意你的观点,但我只得到上面评论中提到的字符串。运行代码段,它显示输出,否则检查这个沙盒:如何传递。tz(“美国/芝加哥”)动态??我们必须从哪里得到这个