在处理阿拉伯语语言环境时正确格式化本地UTC日期字符串

时间:2016-11-14 19:09:16

标签: javascript date datetime momentjs

我使用moment.js和moment-timezone获取本地utc日期字符串。我已经创建了下面的功能来实现这一目标。在处理阿拉伯语区域设置时尝试使用此功能时,我收到了无效的日期。

function _getLocalUtcDateString(utcDateString, timezoneId) {
    var utcMoment = moment.utc(utcDateString, 'MM/DD/YYYY hh:mm:ss A').format('MM/DD/YYYY hh:mm:ss A');
    var localTimeTz = moment.utc(utcMoment).tz(timezoneId).format('MM/DD/YYYY hh:mm:ss A');
    return localTimeTz;
}

如果我使用以下参数_getLocalUtcDateString("11/2/2016 4:45:47 PM", "America/New_York")调用它并设置moment.locale('ar'),则会因无效日期而失败。问题似乎是utcMoment,当lacale是阿拉伯语时,此值等于١١/٠٢/٢٠١٦ ٠٤:٤٥:٤٧ ص,导致moment.utc(utcMoment).tz(timezoneId).format('MM/DD/YYYY hh:mm:ss A');失败。

1 个答案:

答案 0 :(得分:1)

如果您打开控制台,您将看到以下警告消息:

  

弃用警告:提供的值不是公认的ISO格式。时刻构造回落到js Date(),这在所有浏览器和版本中都不可靠。不鼓励使用非ISO日期格式,并将在即将发布的主要版本中删除。有关详细信息,请参阅http://momentjs.com/guides/#/warnings/js-date/

所以问题是你正在尝试解析一个不是公认的ISO格式的字符串(有关其他信息,请参阅parsing docs)。

要解决此问题,您只需删除功能第一行中不必要的format(),如以下工作代码段所示:

function _getLocalUtcDateString(utcDateString, timezoneId) {
    var utcMoment = moment.utc(utcDateString, 'MM/DD/YYYY hh:mm:ss A');
    var localTimeTz = moment.utc(utcMoment).tz(timezoneId).format('MM/DD/YYYY hh:mm:ss A');
    return localTimeTz;
}

moment.locale('ar');
var res = _getLocalUtcDateString("11/2/2016 4:45:47 PM", "America/New_York");
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.16.0/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.7/moment-timezone-with-data-2010-2020.min.js"></script>