LINUX.ORG.RU

А есть способ сделать форматирование даты в яваскрипте более адекватным образом?

 ,


0

1

А то мне кажется что получается жуткий говнокод. Но гугл дает либо похожие примеры, либо советует использовать сторонние тулзы. А у меня и так зависимостей over9k в проекте, не хотелось бы лишних плодить.

var _date = e.localDate;
_date.setDate(_date.getDate() + 2);
var month = (_date.getMonth() + 1) < 10 ? "0" + (_date.getMonth() + 1) : (_date.getMonth() + 1);
var date = _date.getDate() < 10 ? "0" + _date.getDate() : _date.getDate();
var hours = _date.getHours() < 10 ? "0" + _date.getHours() : _date.getHours();
var minutes = _date.getMinutes() < 10 ? "0" + _date.getMinutes() : _date.getMinutes();
$scope.requestMemberModel.to = e.date.getFullYear() + "-" + month + "-" + date + " " + hours + ":" + minutes;
★★★★

Либо говнокод, либо moment.js.

Хотя, если по счастливой случайности в уже существующих зависимостях есть аналог sprintf, то можно убрать вот эти вот < 10 ? "0".

anonymous
()

Прибавление нолика вынеси в функцию хотя бы. И уже можно будет записать в две или три строчки все это, без вспомогательных переменных.

amomymous ★★★
()

мыж на числах такчто

function last2(a){return «„+Math.floor(a/10)+(a%10);}

qulinxao ★★☆
()
Number.prototype.pad = function (width, z) {
    var n = this;
    z = z || '0';
    n = n + '';
    return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
};

Date.prototype.addDays = function (days) {
    return new Date(+this + 86400 * 1000 * days);
};

Date.prototype.toFancyFormat = function () {
    var date = this,
        YYYY = date.getFullYear(),
        MM = (date.getMonth() + 1).pad(2),
        DD = date.getDate().pad(2),
        HH = date.getHours().pad(2),
        mm = date.getMinutes().pad(2);

    return YYYY + "-" + MM + "-" + DD + " " + HH + ":" + mm;
};


$scope.requestMemberModel.to = e.localDate.addDays(2).toFancyFormat();

noomorph
()
Ответ на: комментарий от Nagwal

близко к концепту, но могут быть баги (только неплохо бы прогнать со стресс-тестами и валидацией (особенно иррегулярных дат и пограничных значений...))
http://phpjs.org/functions/date/

как дубовый вариант, можно сделать public api и аяксом запрашивать, но неудобно из-за асинхронности, хотя...

В nodejs должны быть либы для вдохновения (npm)...

swwwfactory ★★
()
Последнее исправление: swwwfactory (всего исправлений: 1)
Ответ на: комментарий от swwwfactory

Ну вот так теоретически можно попробовать

var d = new Date();
d.toISOString().replace(/T(\d+:\d+).*$/, " $1");

А если серьезно, то без подключения сторонней большой функции (или библиотеки) гибкого форматирования не добьешься.

noomorph
()
d.strftime('%Y/%m/%d')
» en: 2008/04/25
» fr: 2008/04/25
» de: 2008/04/25

d.strftime('%A, %d %B')
» en: Friday, 25 April
» fr: Vendredi, 25 Avril
» de: Freitag, 25 April


http://hacks.bluesmoon.info/strftime/strftime.js
joy4eg ★★★★★
()
Ответ на: комментарий от noomorph

А если серьезно, то без подключения сторонней большой функции (или библиотеки) гибкого форматирования не добьешься.

в качестве фастфуда сойдет, но на регулярках можно обломаться или вечно заниматься поддержкой кода... Хотя да - в качестве «растворимого кофе» смотрится вполне, но нужны расширения и наборы шаблонов еще т.к. это хинт в общем.

Без реализации библиотек типа типов или хотя бы форматтеров или на худой конец реализаций cout>>> шутка - сложновато обойтись для реализации поддержки шаблонов форматирования. Только быдлокод только хард... Хотя это не дело конечно плодить лишние сущности...

swwwfactory ★★
()
Ответ на: комментарий от swwwfactory

Поддерживаю. Это действительно лишь в качестве «фаст-фуда».

Мне лично moment.js нравится. Если предстоит несколько видов форматирования дат и арифметика на датах, то дешевле будет заюзать.

noomorph
()

В bower поищите готовые модули.

Либо если сами хотите - вместо склейки воспользуйтесь имлементацией sprintf() или чем-то упрощенным типа такого https://github.com/joyent/node/blob/master/lib/util.js#L22-L59 . Замена колхозной склейки на форматирование обычно приводит код во вменяемое состояние.

Vit ★★★★★
()
Ответ на: комментарий от ritsufag

Да, он. Правда одностраничность тут особо не при чем. Надо просто при вводе даты в первый input проставлять значение второго на +2 дня от первого. И кидаться запросом на сервак ради этого было бы крайне шибанутым решением:)

А у нас никак нормального яваскриптера не найдут. Приходится мне руками в морду лезть, а я мало того, что знаю js довольно посредственно, так меня еще и подташнивает от него довльно ощутимо.

Nagwal ★★★★
() автор топика
Ответ на: комментарий от Jaberwock

Нехорошо, но так как автор говорил, что подкючать библиотеки уже не будет, то вероятность конфликта имен низка.

Ну а потом, вчера было Ruby-настроение, а там, если вы в теме, очень приветствуется всякая мета-магия вроде my_date.add(2.days). Такое вот было желание левой пятки. :)

Как вариант, во избежание вмешательства в прототипы пишется оберточный объект с соответствующими методами.

Рад, что в AngularJS все же нашелся форматтер - это хорошо.

noomorph
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.