我正在開發一個項目,我給出了微軟的日期/時間格式,這個格式好像和標準的ISO formatting完全一樣。Moment.js不支持Microsoft/ISO格式?
當我嘗試使用Moment.js格式化日期時,它不能正確顯示。例如,我提供的格式對於2位數年份具有「yy」,對於1位數月份具有「d」。
當我看到Moment.js format文檔時,我意識到它甚至不支持它?這有點奇怪?爲什麼它不支持標準?
或者我做錯了什麼?我錯過了什麼嗎?
我真的很討厭嘗試寫一個ISO到Moment.js格式轉換器。
有沒有人有同樣的問題?如果是這樣,你怎麼解決這個問題?
更新二○一七年十月一十六日17:32:
在評論正從馬特·約翰遜一個很好的問題下來後,我再次閱讀我的文章,並意識到我已經工作了這麼長時間這個「嵌入式」網絡項目,我可能不太清楚「窗口給我一個日期格式」是什麼意思。所以我寫了以下回應他的問題:
@MattJohnson,我的意思是,我正在爲客戶端的Web項目是一個IE應用程序嵌入(OLE)在Windows應用程序(編譯二進制,不是網絡)。 Web應用程序的JavaScript部分與桌面應用程序「交談」以接收/發送數據。我收到的一個數據是「dateFormat」和「timeFormat」屬性。我收到的值,我被告知直接來自Windows機器(基於該操作系統的用戶配置)。發生這種情況的原因是,年/日都是小寫字母,導致Moment.js無法正確格式化日期。因此,我現在有了轉換。
實例:
調用
力矩()格式();
會產生
「2017-10-13T13:24:47-04:00」
現在,如果我想根據Moment.js文檔,它格式化,我會這樣做:
moment()。格式( 'MM/DD/YYYY');
爲了得到這個:
「2017年10月13日」
的問題是,Windows沿着這種格式傳遞:
「DD/MM/yyyy「
So當我給它打電話時,像:
moment()。format('dd/MM/yyyy');
給我這個:
「VE/30/YYYY」
雖然我期待這樣的:
13/10/2017
當我看着很多其他的da te格式化庫,我發現他們都支持'yyyy','dd'和'MM'結構。但不是Moment.js。
更新2017年10月13日16:41:
我做微軟的日期/時間格式到Moment.js量的比較,看到的差異。
* ---------------------------------------------------------------------------------------------
* Unit Microsoft Examples Moment.js Differnces?
* ---------------------------------------------------------------------------------------------
* day d, dd 1, 01 D, DD Yes, case
* day of week ddd, dddd Fri, Friday ddd, dddd None
* month M, MM, MMM, MMMM 8, 08, Oct., October M, MM, MMM, MMMM None
* year yy, yyyy 17, 2017 YY, YYYY Yes, case
*
* hour h, hh, H, HH 3, 03, 15, 15 h, hh, H, HH None
* minutes m, mm 9, 09 m, mm None
* seconds s, ss 5, 05 s, ss None
*/
利用這些信息,我很快就寫了一個格式轉換功能:
function windowsFormatToMomentJSFormat(windowsFormat) {
var format = windowsFormat;
console.log("Converting date format...");
if (!windowsFormat) return format;
console.log(" > From : '" + windowsFormat + "'");
format = format.replace(/y/g, 'Y'); // Fix case for years
format = format.replace(/d{4}/g, '#'); // Protect 4-digit DOW sequence
format = format.replace(/d{3}/g, '&'); // Protect 3-digit DOW sequence
format = format.replace(/d/g, 'D'); // Fix case for days
format = format.replace(/#/g, 'dddd'); // Restore our sequence
format = format.replace(/&/g, 'ddd'); // Restore our sequence
console.log(" > To : '" + format + "'");
console.log(" > Applied : '" + moment().format(format) + "'");
return format;
}
它似乎運作良好,但我希望我是在先進的正則表達式要好得多爲了優化功能,並刪除保護/恢復代碼。
所以現在,我的Windows格式字符串似乎通過Moment.js的format()函數正確處理。
我不明白你要做什麼。你是否將一個日期傳遞給ASP.NET的moment.js? – Dmitry
@Dmitry我用一些例子更新了我的問題。希望有所幫助。 – Jeach
我很確定ISO8601沒有定義在 日期解析器和格式器中使用什麼圖例。這些是庫/ PL特定的。 ISO8601指定日期格式本身。 'moment().format();'產生一個ISO格式的日期時間。而且似乎'moment'使用https://www.w3.org/TR/NOTE-datetime中的傳說。 Python例如使用完全不同的圖例格式https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior。順便說一句,你的「dd/mm/yyyy」完全違背ISO。 – Dmitry