Дата выпуска по стандарту ISO 8601
У меня есть строка даты ISO в переменной javascript, и я хочу отформатировать ее для отображения. Вы можете подумать достаточно просто. Например:
new Date(iso).toDateString()
Однако даты ISO могут представлять только год ("гггг") или год и месяц ("гггг-мм"); они не всегда "гггг-мм-дд". При этих обстоятельствах метод разбора заполняет значения по умолчанию для пропущенных полей, которые я не хочу видеть.
Другими словами, я хочу форматировать только поля даты, определенные в строке ISO, но не другие. Если строка ISO была "2017-12", то я могу захотеть отформатировать ее как 12/2012, декабрь 2017, декабрь 2017, декабрь 2017, в зависимости от моей локали и уровня детализации; Я не хотел бы номер дня. Точно так же, если строка ISO была только "2017", я бы не хотел указывать день или месяц.
Этот вопрос в первую очередь относится к утвержденным формам ISO и поэтому не является дубликатом.
Существует ли простой способ форматирования таких дат ISO должным образом - предпочтительно с учетом региональных особенностей - или я должен делать все это длинными руками?
2 ответа
Это решение, которое основано на некоторых комментариях Марка Рида, является тем, которое я в конечном итоге принял.
По умолчанию нет поддержки для исключенных форм ISO (гггг-мм или гггг). Требование должно использовать объект Date для определения других выходных полей, например, дня недели (если день указан в строке ISO), например "воскресенье". Однако объект Date хранит временную метку, поэтому при разборе пропущенной строки ISO необходимо установить значения по умолчанию для пропущенных полей. Кроме того, он также должен использовать библиотеку, поддерживающую локали, такую как moment.js.
Хотя при синтаксическом анализе отсутствующие поля, такие как день или месяц, были бы установлены по умолчанию, их можно снова удалить на этапе форматирования, и можно выбрать соответствующую строку форматирования на основе длины исходной исключенной строки ISO.
Решение должно основываться на моменте.js путем определения новых строк локализованного форматирования (аналогично L, LL, LLL и т. Д.) Для исключенных форм, например, LYM/lym для обработки случая ISO YYYY-MM. Например:
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.
Если вы используете нативный JavaScript Date
введите в любой точке обработки, то вы застряли; этот тип объекта может хранить только момент времени, представленный внутренне как метка времени ( абсолютное количество миллисекунд с начала UNIX, не считая високосных секунд). Различные get
* методы просто вычисляют значения на основе сохраненной временной метки, а set
* методы расчета новой отметки времени на основе запрошенной корректировки. Если вы установите что-нибудь NaN
или же undefined
тогда сама отметка времени становится NaN
и все get
* методы также вернутся NaN
,
Если вы имеете дело с датами и временем с неопределенными или недерминированными компонентами, вам лучше всего избегать Date
полностью; просто используйте универсальный объект только с полями, которые имеют определенные значения, и напишите свой собственный синтаксический анализатор и средство форматирования для соответствия. Если вы можете извлечь соответствующую часть строки, вы все равно сможете использовать нативный Date
проходящие методы и объекты для обработки хитрых битов, таких как перевод, возможно, сокращенных названий месяцев в числа, чувствительные к локали.