Как стать автором
Обновить

Комментарии 19

А чем не понравилась Moment.js?
На ноде, вроде, прекрасно работает.
> for parsing, manipulating, and formatting
Хорошая библиотека, но мне не надо парсить и валидировать. Это достаточно редкие задачи. Я хотел только форматирование.
Парсинг — обратная задача по отношению к форматированию, иногда, когда код бекенда недоступен нужно парсить даты. Валидация — для ввода.

А вообще, я про форматирование писал. Там огромное количество возможностей, включая поддержку языков. Хотя, следует заметить, уникальные черты у datef есть.
datef, по моей задумке, будет удобно интегрироваться в качестве фильтров в шаблонизаторы. moment.js, имхо, несколько тяжеловесен для этого.

Я понимаю, что парсинг — важная и нужная задача, но пока что она не вставала передо мной так критично.
Один я не понимаю, зачем это нужно?
Функция date() из phpjs, также не имеет зависимостей, но выглядит более вкусной за счёт известного шаблона форматов и практически гарантированой безглючности. (размеры при этом примерно одинаковые).

Но задача актуальная, так что при наличии интереса конечно продолжайте. Особо интересными для ленивых могут оказаться хелперы для js-шаблонизаторов с реализацией данного функционала.
А откуда гарантия безглючности?
От аудитории — phpjs популярная библиотека, все баги которые можно было выловить в таких примитивных функциях уже выловлены.
Своих можно добавить только при создании обёртки под RequireJS, но это постараться надо.

Если ваша библиотека обретёт популярность, то через какой-то период времени, можно будет говорить о подобных гарантиях и у неё.
Вряд ли она будет популярной, т.к. у меня нет ни желания, ни умения ее раскручивать:)
Функция leadingZeroes везде добавляет только 2 нуля слева. Можно сократить до

function leadingZeroes(value) {
    return ('00' + value).slice(-2);
}
Не совсем везде 2. Есть, например +0000 год:)
Кстати, тут у меня баг — хорошо, что вы подняли этот вопрос.
Или вот так универсально:

function leadingZeroes( len, value ) { // length - total count of chars
    return Array( len + 1 - value.toString().length ).join('0') + value;
}
Остроумно. Сделаете pull-request?
Не умею git, но хочу научиться на днях ="(.
Если код будет использоваться часто, то такой подход будет не оправданным. Писал в своё время форматтер, он сначала парсил нужный формат и выплёвывал функцию, в которой не было ничего лишнего, а потом через эту функцию гнались все значения. Обычно в проекте надо всего 3-4 формата даты.
>сначала парсил нужный формат и выплёвывал функцию, в которой не было ничего лишнего
У меня так и есть, смотрите на .register и .createFormatter(). Ну, почти так.
надо делать проверку, что длина строки value.length не превышает len, иначе получится ошибка

RangeError: Array length must be a finite positive integer
Это если функцию использовать как-то не так. В задаче автора надо добавлять нули если их не хватает. Для этого в len устанавливают максимально возможную длину, и value.length получается < || =. В глобальном же случае замечание верно.
Использую что то подобное
/*******************************************************************************
* @Name   : "date_format($dt,$ds)"                   // Имя
* #Guid   : {59BA575F-E2FD-40B3-B6D3-CDDED99E635C}   // GUID
* @Create : 25.12.2006/12:26:11                      // Дата создания
* @Exampl : "alert(date_format(new Date(),'yyMMdd_HHmmss_FFF'));" // Пример использования
* @Params :    $dt - Объект Date                     // Параметры запуска
*              $ds - Форматная строка(шаблон возвращаемого значения)
*                  'yyyy'- // Год,[0000-9999]
*                    'yy'- // Год,[00-99]
*                    'MM'- // Месяц,[01-12]
*                     'M'- // Месяц,[1-12]
*                    'dd'- // День месяца,[01-31]
*                     'd'- // День месяца,[1-31]
*                    'HH'- // Час в 24-часо.,[00-23]
*                     'H'- // Час в 24-часо.,[0-23]
*                    'mm'- // Минуты,[00-59]
*                     'm'- // Минуты,[0-59]
*                    'ss'- // Секунды,[00-59]
*                     's'- // Секунды,[0-59]
*                   'FFF'- // Тысячные доли секунды,
*                    'FF'- // Сотые доли секунды.
*                     'F'- // Десятые доли секунды.
*                   'ZZZ'- // Смещение времени в минутах
*                    'ZZ'- // Смещение времени в часах
*
* @Descrp : Функция преобразования даты и времени в строку по требуемому формату // Описание
* @Return : Строку даты и времени в требуемом формате// Возвращаемое значение
* @Depend : _pad(a, b, d, e) для добавления нулей    // Использует (Зависимости)
* GPL applies. No warranties XGuest[25.12.2006/12:26:11] [ver.1.0.0.0]
*******************************************************************************/
function date_format(a, b) {
 var c = new function(a) {
  var b     = Date.prototype, c = require('String')._pad;
  this.yyyy = b.getFullYear.call(a);
  this.yy   = ("" + this.yyyy).substr(2, 2);
  this.M    = b.getMonth.call(a) + 1;
  this.MM   = c(this.M, 2);
  this.dd   = b.getDate.call(a);
  this.d    = c(this.dd, 2);
  this.H    = b.getHours.call(a);
  this.HH   = c(this.H, 2);
  this.m    = b.getMinutes.call(a);
  this.mm   = c(this.m, 2);
  this.s    = b.getSeconds.call(a);
  this.ss   = c(this.s, 2);
  this.FFF  = c(b.getMilliseconds.call(a), 3, 1);
  this.FF   = this.FFF.substr(0, 2);
  this.F    = this.FFF.substr(0, 1);
  this.ZZZ  = c(b.getTimezoneOffset.call(a),    4);
  this.ZZ   = c(b.getTimezoneOffset.call(a)/60, 3);
 }(a);
 return b.replace(/(yyyy|yy|MM|M|dd|d|HH|H|mm|m|ss|s|FFF|FF|F|ZZZ|ZZ)/g, function(a) {return c[a];});
}

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории