Разрешите представить datef — мини-JS-библиотеку вывода даты в разных форматах.
Вкратце опишу имеющиеся фичи:
- Выполняет одну и только одну задачу: вывод дат в разных, потребных юзеру форматах;
- Работает в 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, и я решил сделать свою, современную и расширяемую библиотеку.
А где фича X?
В планах значится — создание локалей, покрытие тестами и выбор лицензии. Если вам чего-то не хватает — то код неспроста выложен на гитхаб:)
Почему оно ни с чем не совместимо?
Потому что 80% функциональности strftime или PHP date() требует 20% времени; остальные 20% функциональности будут нужны 20% людей и потребуют 80% времени. А мне хотелось создать быстрое решение с читабельными токенами.
Автор: k12th