2016-11-14 79 views
0

我使用moment.js和moment-timezone獲取本地utc日期字符串。我已經創建了下面的功能來實現這一點。在處理阿拉伯語語言環境時,如果要使用此功能,我會返回無效的日期。在處理阿拉伯語語言環境時正確格式化本地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,當拉格朗德是阿拉伯語,這個值等於١١/٠٢/٢٠١٦ ٠٤:٤٥:٤٧ ص這是導致moment.utc(utcMoment).tz(timezoneId).format('MM/DD/YYYY hh:mm:ss A');失敗。

+0

你爲什麼要格式化字符串阿拉伯語使用美國格式?如果這是在美國的阿拉伯讀者,那麼語言環境是美國,語言是阿拉伯語。 – RobG

回答

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>

相關問題