Библиотечка datef — форматирование дат

в 17:52, , рубрики: javascript, javascript library, даты, метки: ,

Разрешите представить 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


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js