Разрешите представить datef — мини-JS-библиотеку вывода даты в разных форматах.
Вкратце опишу имеющиеся фичи:
Примеры использования:
Заменив название моей библиотеки своим, можно просто и быстро превратить свою мини-утилиту в модуль с поддержкой разных окружений.
Что касается собственно ядра библиотеки, то там все прямолинейно, и, даже, наверное, скучно: имеется набор токенов, которые служат ключами в объекте. Значения этих ключей — функции, которым передается собственно нужная дата и которые возвращают соответствующее значение. На основе этих же токенов генерируется регулярное выражение, которым и парсится строка формата.
велосипеды решения, созданные матерыми разработчиками.
К сожалению, нашлись только какие-то очень старые библиотечки — как правило, монструзные, комплексные решения по работе с датами, зачастую, к тому же, грешащие расширением Date.prototype, и я решил сделать свою, современную и расширяемую библиотеку.
Вкратце опишу имеющиеся фичи:
- Выполняет одну и только одну задачу: вывод дат в разных, потребных юзеру форматах;
- Работает в nodejs и в браузерах. В браузерах может работать как requirejs/amd-модуль;
- Не мусорит в прототипах встроенных объектов;
- Написана в strict mode;
- Обильно аннотирована в js-doc-формате;
- Не имеет внешних зависимостей.
Примеры использования:
datef('dd.MM.YY', new Date()); // "13.08.12" datef('dd.MM.YY'); // второй аргумент необязателен — берется «сейчас» var d = new Date(); d.setFullYear(2045); datef('dd.MM.YYYY', d); // "13.08.2045" // есть несколько заранее заданных форматов: datef.formatters.ISODateTimeTZ(); // "2012-08-13T15:01:29 -04:00" // можно определить и сохранить свой… datef.register('myFormat', 'd.M.YY'); datef.formatters.myFormat(); // "13.8.12" // или просто получить его как отдельную функцию var myFormat = datef.createFormatter('d.M.YY');
Как оно устроено?
Самое интересное для меня, с точки зрения кода, было соблюдение экологии — то есть работа с системой модулей как nodejs, так и requirejs/amd. К счастью, все оказалось довольно просто:(function () { 'use strict'; var datef = { answer: 42 }; // Expose our precious function to outer world. if (typeof exports !== 'undefined') { // node.js way module.exports.datef = datef; } else if (typeof define === 'function' && define.amd) { // requirejs/amd env define( 'datef', [], function () { return datef; } ); } else { // plain browser environment root.datef = datef; } })();
Заменив название моей библиотеки своим, можно просто и быстро превратить свою мини-утилиту в модуль с поддержкой разных окружений.
Что касается собственно ядра библиотеки, то там все прямолинейно, и, даже, наверное, скучно: имеется набор токенов, которые служат ключами в объекте. Значения этих ключей — функции, которым передается собственно нужная дата и которые возвращают соответствующее значение. На основе этих же токенов генерируется регулярное выражение, которым и парсится строка формата.
Но зачем?
Как известно, в Javascript нет поддержки чего-нибудь вроде Date#toFormat. Существует только нестандартный Gekko'вский Date#toLocaleFormat. В один прекрасный момент я понял, что таскаю из проекта в проект одни и те же примитивные велосипеды вида utils.date.humanDate, utils.date.humanTime и им подобные — и стал искать проверенные, гибкиеК сожалению, нашлись только какие-то очень старые библиотечки — как правило, монструзные, комплексные решения по работе с датами, зачастую, к тому же, грешащие расширением Date.prototype, и я решил сделать свою, современную и расширяемую библиотеку.
