Конечно, вы можете создать определенную функцию для каждого варианта представления строки даты. Если вы рассматриваете международные форматы дат, вы получаете десятки специальных функций со смешными именами, которые трудно различить.
Нет разумной функции, которая соответствует всем форматам, но есть разумная композиция функций, которая делает:
const pipe2 = f => g => x =>
g(f(x));
const pipe3 = f => g => h => x =>
h(g(f(x)));
const invoke = (method, ...args) => o =>
o[method] (...args);
const padl = (c, n) => s =>
c.repeat(n)
.concat(s)
.slice(-n);
const inc = n => n + 1;
// generic format date function
const formatDate = stor => (...args) => date =>
args.map(f => f(date))
.join(stor);
// MAIN
const toYYYYMMDD = formatDate("") (
invoke("getFullYear"),
pipe3(invoke("getMonth")) (inc) (padl("0", 2)),
pipe2(invoke("getDate")) (padl("0", 2)));
console.log(toYYYYMMDD(new Date()));
Да, это много кода. Но вы можете выразить буквально каждое строковое представление даты, просто изменив аргументы функции, переданные функции более высокого порядка formatDate
. Все ясно и декларативно, то есть вы можете почти прочитать, что происходит.