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

时间:2017-07-05 15:05:28

标签: javascript date datetime firefox momentjs

我有一个脚本,我试图将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中的日期无效。建议?

2 个答案:

答案 0 :(得分:2)

使用片刻,您可以使用moment.utclocal()

var newdate = moment.utc($(this).text()).local().format('ddd MMM DD YYYY h:mm A')

moment.utc将您的输入解析为UTC值,而local()将其转换为当地时间。

答案 1 :(得分:1)

您的格式字符串与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