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

Properly formatting a local UTC date string when dealing with an Arabic locale

本文关键字:格式化 UTC 字符串 日期 阿拉伯 处理 语言 环境      更新时间:2023-09-26

我使用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');失败。

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

弃用警告:提供的值不是可识别的ISO格式。moment构造返回到js Date(),它在所有浏览器和版本中都不可靠。不鼓励使用非ISO日期格式,并将在即将发布的主要版本中删除。更多信息请访问http://momentjs.com/guides/#/warnings/js-date/。

所以问题是你试图解析一个字符串,不是在一个可识别的ISO格式(见解析文档的更多信息)。

要解决这个问题,只需删除函数第一行中不必要的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>