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