簡體   English   中英

格式已刪除ISO 8601日期

[英]Format Elided ISO 8601 Date

我在javascript變量中有一個ISO日期字符串,我想對其進行格式化以進行顯示。 簡單地說,您可能會認為。 例如:

new Date(iso).toDateString()

但是,ISO日期只能代表年份(“ yyyy”)或年份和月份(“ yyyy-mm”); 他們並不總是“ yyyy-mm-dd”。 在這種情況下,parse方法將為缺少的字段填寫默認值,我不想看到這些默認值。

換句話說,我只想格式化在ISO字符串中定義的日期字段,而沒有其他格式。 如果ISO字符串為“ 2017-12”,那么我可能希望將其格式化為12 / 2012、2017年12月,2017年12月,2017年12月13日之一,具體取決於我的語言環境和詳細程度; 我不希望有天數。 同樣,如果ISO字符串僅為“ 2017”,那么我就不需要日期或月份指示。

這個問題主要與被淘汰的ISO表單有關,因此不是重復的問題。

是否有一種簡單的方法來正確格式化此類ISO日期-最好以一種可識別語言環境的方式進行格式化-還是我必須長期這樣做?

如果在處理的任何時候都使用JavaScript的本機Date類型,那么您將陷入困境; 該對象類型只能存儲一個即時時間,在內部以時間戳記表示( 自UNIX時代以來的絕對毫秒數,不包括leap秒 )。 各種get *方法僅基於存儲的時間戳來計算值,而set *方法則基於請求的調整來計算新的時間戳。 如果將任何內容設置為NaNundefined ,則時間戳本身將變為NaN並且所有get *方法將同樣返回NaN

如果您要處理不確定的或未指定的組件的日期和時間,則最好完全避免使用Date 只需使用僅具有定義值的字段的通用對象,然后編寫自己的解析器和格式化程序即可匹配。 如果可以提取字符串的相關部分,則仍可以使用傳遞中的本機Date方法和對象來處理棘手的位,例如以對語言環境敏感的方式將可能縮寫的月份名稱轉換為數字。

這個解決方案基於Mark Reed的一些評論,是我最終采用的解決方案。

省略的ISO格式(yyyy-mm或yyyy)沒有默認支持。 需求必須使用Date對象才能確定其他輸出字段,例如,星期幾(如果在ISO字符串中指定了一天),例如“星期日”。 但是,Date對象存儲一個時間戳,因此在解析消除的ISO字符串時,必須默認缺少字段。 另外,它還需要使用可識別語言環境的庫,例如moment.js。

盡管在解析過程中將默認缺少諸如日或月之類的字段,但可以在格式化階段再次將其消除,並可以根據原始省略的ISO字符串的長度選擇相關的格式字符串。

該解決方案應在moment.js的基礎上,通過為隱藏形式(例如,LYM / lym)定義新的本地化格式字符串(類似於L,LL,LLL等)來處理YYYY-MM ISO情況。 例如:

var LY = "YYYY";        // e.g. 2017
var ly = "YY";
var LYM = "MMMM YYYY";      // e.g. December 2017
var lym = "MMM YYYY";
var LYMD = "dddd MMMM D, YYYY";
var lymd = "ddd MMM D, YYYY";   // e.g. Tuesday December 19, 2017

這些格式字符串將有效地忽略在解析ISO字符串時添加的任何默認字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM