2017-10-13 129 views
0

我正在開發一個項目,我給出了微軟的日期/時間格式,這個格式好像和標準的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()函數正確處理。

+0

我不明白你要做什麼。你是否將一個日期傳遞給ASP.NET的moment.js? – Dmitry

+0

@Dmitry我用一些例子更新了我的問題。希望有所幫助。 – Jeach

+0

我很確定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

回答

1

是的,你需要一個轉換函數,因爲日期/時間格式化令牌在不同的庫和平臺上是不同的。我知道沒有一個已經開發出來。

請注意,您目前的功能缺少幾個標記。特別是am/pm分隔符需要翻譯,你也應該考慮文字和轉義序列。

+0

謝謝馬特,您的帖子及其鏈接和所有內容。至於我的功能,是的,我意識到它缺少轉換,正如你指出的那樣。我現在只需要嚴格的最低限度就可以繼續前進。我會嘗試聯繫Moment.js小組,看看他們是否有計劃添加對各種格式化程序的支持。我會接受你的答案作爲最有幫助的(連同你的評論)。謝謝! – Jeach