@opengis/fastify-table
Version:
core-plugins
232 lines (231 loc) • 8 kB
JavaScript
/* eslint-disable no-param-reassign */
const monthUa = {
0: "січня",
1: "лютого",
2: "березня",
3: "квітня",
4: "травня",
5: "червня",
6: "липня",
7: "серпня",
8: "вересня",
9: "жовтня",
10: "листопада",
11: "грудня",
};
const monthRu = {
0: "января",
1: "февраля",
2: "марта",
3: "апреля",
4: "мая",
5: "июня",
6: "июля",
7: "авгувта",
8: "сентября",
9: "октября",
10: "ноября",
11: "декабря",
};
const monthEn = {
0: "january",
1: "february",
2: "march",
3: "april",
4: "may",
5: "june",
6: "july",
7: "august",
8: "september",
9: "october",
10: "november",
11: "december",
};
const weekDayUa = {
1: "Понеділок",
2: "Вівторок",
3: "Середа",
4: "Четвер",
5: "Пёятниця",
6: "Субота",
0: "Неділя",
};
const mthShort = {
ua: {
0: "Січ",
1: "Лют",
2: "Бер",
3: "Кві",
4: "Тра",
5: "Чер",
6: "Лип",
7: "Сер",
8: "Вер",
9: "Жов",
10: "Лис",
11: "Гру",
},
ru: {
0: "Янв",
1: "Фев",
2: "Мар",
3: "Апр",
4: "Май",
5: "Июн",
6: "Июл",
7: "Авг",
8: "Сен",
9: "Окт",
10: "Ноя",
11: "Дек",
},
};
const mth = {
ua: {
0: "Січень",
1: "Лютий",
2: "Березень",
3: "Квітень",
4: "Травень",
5: "Червень",
6: "Липень",
7: "Серпень",
8: "Вересень",
9: "Жовтень",
10: "Листопад",
11: "Грудень",
},
ru: {
0: "Январь",
1: "Февраль",
2: "Март",
3: "Апрель",
4: "Май",
5: "Июнь",
6: "Июль",
7: "Август",
8: "Сентябрь",
9: "Октябрь",
10: "Ноябрь",
11: "Декабрь",
},
};
/**
* Форматування дати. Є можливість обмеження точності. Є можливість зміщення дат і часу. Є можливість виведення дати на момент запиту.
*
* @summary Форматування дати за умовою і можливе зміщення дат і часу. Є можливість виведенння поточної дати через значення аргументу "0"
* @priority 3
* @type helper
* @tag format
* @alias formatDate
* @example
* {{formatDate "2021-09-08T12:22:27.983" shift_year=1 format='mm - yy mw_ru'}}
* @descr Виведення дати формату 09 - 2021 з назвою місяця російською мовою
* @example
* {{formatDate "2021-09-08T12:22:27.983" shift=1478 format='dd.MM.YY hh:mi:sec'}}
* @descr Виведення дати із зсувом відносно "2021-09-08T12:22:27.983" на 5 діб (13.09.21 12:22:27)
* @example
* {{formatDate "2021-09-08T12:22:27.983" trunc='year' format='dd month yy hh:mi:sec'}}
* @example
* {{formatDate "2021-09-08T12:22:27.983" trunc='quarter' format='dd.MM.yy hh:mi:sec'}}
* @example
* {{formatDate "2021-09-08T12:22:27.983" format='dd.mm.yy hh:mi'}}
* @descr Виведення дати формату 08.09.2021 12:22
* @example
* {{formatDate 0}}
* @descr Виведення поточної дати
* @param {String} format Формат для вигляду при поверненні.Можливі значення: dd, mm, MM, month, mon, yy, YY, hh, mi, sec, mw_ua, mw_en, mw_ru, wd_ua
* @param {Any} time Для вибору чи робити формат виводу години і хвилини, чи ні
* @param {String} trunc Для вибору чи онуляти рік або квартал
* @param {Number} shift_year Здвинути рік
* @param {Number} shift_quarter Здвинути квартал
* @param {Number} shift_month Здвинути місяць
* @param {Number} shift_week Здвинути тиждень
* @param {Number} shift Здвинути час
* @param {Date|String} data Набір вхідних даних
* @returns {String} Returns HTML
*/
export default function formatDate(data, options = {}) {
if (typeof data === "object" && data === null)
return "";
if (typeof data === "undefined")
return "";
if (!data.toLocaleDateString && data && data.includes("T")) {
data = new Date(data);
}
if ((!options.hash.format || options.hash.format === "dd.mm") &&
data &&
data.toLocaleDateString) {
const time = options.hash.time
? `${data.getHours()}:${data.getMinutes()}`
: "";
let m = data.getMonth() + 1;
m = m < 10 ? `0${m}` : m;
const dt = options.hash.format === "dd.mm"
? `${data.getDate()}.${m}`
: `${data.getDate()}.${m}.${data.getFullYear()}`;
return dt + (options.hash.time && time !== "00:00" ? ` ${time}` : "");
}
let val = data;
options.hash = options.hash || {};
if (typeof val === "string" &&
(val.match(/\./g) || []).length === 2 &&
val.length < 11) {
val = val.replace(/(\d{2}).(\d{2}).(\d{4})/, "$2/$1/$3");
}
try {
val = val === 0 || val === "0" ? new Date() : new Date(val);
}
catch (e) {
return val;
}
if (options.hash.trunc) {
val =
options.hash.trunc === "year"
? new Date(new Date(val.setMonth(0)).setDate(1))
: val;
val =
options.hash.trunc === "quarter"
? new Date(new Date(val.setMonth(val.getMonth() - (val.getMonth() % 3))).setDate(1))
: val;
}
if (options.hash.shift_year) {
val = new Date(val.setYear(val.getFullYear() + (options.hash.shift_year - 0)));
}
if (options.hash.shift_quarter) {
val = new Date(val.setMonth(val.getMonth() + (options.hash.shift_quarter - 0) * 3));
}
if (options.hash.shift_month) {
val = new Date(val.setMonth(val.getMonth() + (options.hash.shift_month - 0)));
}
if (options.hash.shift_week) {
val = new Date(val.getTime() + (options.hash.shift_week - 0) * 86400 * 7 * 1000);
}
if (options.hash.shift) {
val = new Date(val.getTime() + 86400000 * (options.hash.shift - 0));
}
if (options.hash.shift_time) {
val = new Date(val.getTime() + (options.hash.shift_time - 0));
}
if (options.hash.format === "iso")
return val.toISOString();
const opt1 = {
dd: (val.getDate() < 10 ? "0" : "") + val.getDate(),
mm: (val.getMonth() < 9 ? "0" : "") + (val.getMonth() + 1),
MM: (val.getMonth() < 9 ? "0" : "") + (val.getMonth() + 1),
month: (mth[options.data?.root?.lang || "ua"] || {})[val.getMonth()],
mon: (mthShort[options.data && options.data.root && options.data.root.lang
? options.data.root.lang
: "ua"] || {})[val.getMonth()],
yy: val.getFullYear(),
YY: `${val.getFullYear()}`.substr(-2),
hh: (val.getHours() < 10 ? "0" : "") + val.getHours(),
mi: (val.getMinutes() < 10 ? "0" : "") + val.getMinutes(),
sec: (val.getSeconds() < 10 ? "0" : "") + val.getSeconds(),
mw_ua: monthUa[val.getMonth()],
mw_en: monthEn[val.getMonth()],
mw_ru: monthRu[val.getMonth()],
wd_ua: weekDayUa[val.getDay()],
};
return Object.keys(opt1).reduce((prev, el) => prev.replace(el, opt1[el]), options.hash.format || "dd.mm.yy");
}