@opengis/fastify-table
Version:
core-plugins
259 lines (247 loc) • 7.6 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 && options.data.root && options.data.root.lang
? 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');
};