Javascript Firefox中使用.toLocaleString()和moment.js的日期无效

Javascript Firefox中使用.toLocaleString()和moment.js的日期无效,javascript,date,datetime,firefox,momentjs,Javascript,Date,Datetime,Firefox,Momentjs,我有一个脚本,试图将UTC日期/时间转换为本地时区。这一切在Chrome和IE/Edge中似乎都运行良好,但在Firefox中显示“无效日期”。堆栈上还有几个其他问题,但似乎没有一个能解决我的具体需求 我的剧本是这样的 获取由Fabrik在Joomla中输出的特定格式的日期。(我对这种格式几乎没有控制权) 看起来是这样的: 2017-07-02 20:57 然后我创建了一个新的UTC日期,并将其转换为本地时区 toLocalString方法: $(document).ready(functio

我有一个脚本,试图将UTC日期/时间转换为本地时区。这一切在Chrome和IE/Edge中似乎都运行良好,但在Firefox中显示“无效日期”。堆栈上还有几个其他问题,但似乎没有一个能解决我的具体需求

我的剧本是这样的

获取由Fabrik在Joomla中输出的特定格式的日期。(我对这种格式几乎没有控制权)

看起来是这样的:

2017-07-02 20:57
然后我创建了一个新的UTC日期,并将其转换为本地时区

toLocalString方法:

$(document).ready(function() {
        $('.plg-date > .fabrikElement > div').not('.fabrikSubElementContainer').each(function() {
            if($(this).text().length > 0) {
                var newdate = new Date($(this).text() + " UTC");
                var options = { 
                    year: 'numeric', 
                    month: 'numeric', 
                    day: 'numeric',
                    hour: '2-digit',
                    minute: '2-digit',
                    timeZoneName: 'short'
                }
                $(this).text(newdate.toLocaleString('en-US', options)); 
            }
        })
    });
moment.js方法:

$(document).ready(function() {
    $('.plg-date > .fabrikElement > div').not('.fabrikSubElementContainer').each(function() {
        if($(this).text().length > 0) {
            var date = new Date($(this).text() + " UTC");
            var newdate = moment(date).format('ddd MMM DD YYYY h:mm A')
            $(this).text(newdate);
        }
    })
});

这两种方法都会导致firefox中的日期无效。建议?

您的格式字符串与两个API所需的内容不匹配。您当前传递的文本(
2017-07-02 20:57
)末尾附加了
UTC
(即
2017-07-02 20:57 UTC
)。在javascript控制台中:

new Date("2017-07-02 20:57");
Date 2017-07-02T19:57:00.000Z
new Date("2017-07-02 20:57 UTC")
Invalid Date
如果您删除
UTC
组件,它应该可以工作。但是请注意,javascript正在将
20:57
转换为
19:57
。这是因为夏令时可能发生在客户端的计算机上。这是否会影响你的应用取决于时间戳的来源


至于您给出的示例,您的输入字符串的格式字符串应该是
YYYY-MM-DD HH:MM

您的格式字符串与两个API所需的格式字符串不匹配。您当前传递的文本(
2017-07-02 20:57
)末尾附加了
UTC
(即
2017-07-02 20:57 UTC
)。在javascript控制台中:

new Date("2017-07-02 20:57");
Date 2017-07-02T19:57:00.000Z
new Date("2017-07-02 20:57 UTC")
Invalid Date
如果您删除
UTC
组件,它应该可以工作。但是请注意,javascript正在将
20:57
转换为
19:57
。这是因为夏令时可能发生在客户端的计算机上。这是否会影响你的应用取决于时间戳的来源

对于您给出的矩示例,输入字符串的格式字符串应为
YYYY-MM-DD HH:MM

使用矩您可以使用和:

将输入解析为UTC值,同时将其转换为本地时间。

使用您可以使用的时间,并:


将您的输入解析为UTC值,同时将其转换为本地时间。

使用矩创建日期实例,并使用一种显式格式描述您得到的日期字符串。这是唯一安全的做法;当你给浏览器一个不在规范中的字符串时,浏览器可以随心所欲。如果你给Moment库提供一个你自己创建的
Date
对象,你将无法从Moment的日期解析功能中获益。要么坚持片刻,要么完全放弃它。将“UTC”更改为“Z”或“+00:00”应该可以工作,因为这些将生成可接受的ISO8601日期字符串。使用片刻和描述您拥有的日期字符串的显式格式创建日期实例。这是唯一安全的做法;当你给浏览器一个不在规范中的字符串时,浏览器可以随心所欲。如果你给Moment库提供一个你自己创建的
Date
对象,你将无法从Moment的日期解析功能中获益。要么坚持现在,要么完全放弃。将“UTC”更改为“Z”或“+00:00”应该有效,因为它们会生成可接受的ISO8601日期字符串。是的,我尝试过放弃UTC组件,但它确实消除了无效日期,然而,它随后将20:57作为8:57 EDT输出,期望的输出将是4:57 EDT。这就是的时区部分。浏览器假定日期与客户端计算机使用的时区相同。您需要将时区信息添加到时间戳中,以使其正确移动(我相信)。是的,我已尝试删除UTC组件,它确实删除了无效日期,但它随后将20:57输出为8:57 EDT,其中所需的输出将为4:57 EDT。这就是的时区组件。浏览器假定日期与客户端计算机使用的时区相同。您需要将时区信息添加到时间戳中,以使其正确移动(我相信)。在quickie上,如果可能的话,如何显示时间转换为的时区?@SandraWillford您可以使用
Z
ZZ
令牌获取UTC偏移量(例如
+02:00
),当使用
z
获取时区缩写时,不推荐使用缩写,并且只能与时间时区一起使用(更多信息请参见方法的时区部分)。在quickie上,如果可能,如何显示时间转换为的时区?@SandraWillford您可以使用
z
ZZ
标记获取UTC偏移量(例如,
+02:00
),当使用
z
获取时区缩写时,不推荐使用,并且只能与时刻时区一起使用(方法时区部分中有更多信息)。