- PVSM.RU - https://www.pvsm.ru -

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

Разрешите представить datef [1] — мини-JS-библиотеку вывода даты в разных форматах.
Вкратце опишу имеющиеся фичи:

  • Выполняет одну и только одну задачу: вывод дат в разных, потребных юзеру форматах;
  • Работает в nodejs и в браузерах. В браузерах может работать как requirejs/amd [2]-модуль;
  • Не мусорит в прототипах встроенных объектов;
  • Написана в 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 [3]. В один прекрасный момент я понял, что таскаю из проекта в проект одни и те же примитивные велосипеды вида utils.date.humanDate, utils.date.humanTime и им подобные — и стал искать проверенные, гибкие велосипеды решения, созданные матерыми разработчиками.
К сожалению, нашлись только какие-то очень старые библиотечки — как правило, монструзные, комплексные решения по работе с датами, зачастую, к тому же, грешащие расширением Date.prototype, и я решил сделать свою, современную и расширяемую библиотеку.

А где фича X?

В планах значится — создание локалей, покрытие тестами и выбор лицензии. Если вам чего-то не хватает — то код неспроста выложен на гитхаб:)

Почему оно ни с чем не совместимо?

Потому что 80% функциональности strftime [4] или PHP date() [5] требует 20% времени; остальные 20% функциональности будут нужны 20% людей и потребуют 80% времени. А мне хотелось создать быстрое решение с читабельными токенами.

Автор: k12th


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/13076

Ссылки в тексте:

[1] datef: https://github.com/hogart/datef

[2] requirejs/amd: http://requirejs.org/docs/whyamd.html

[3] нестандартный Gekko'вский Date#toLocaleFormat: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/toLocaleFormat

[4] strftime: http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.html

[5] PHP date(): http://php.net/manual/ru/function.date.php