UNPKG

@opengis/fastify-table

Version:

core-plugins

259 lines (247 loc) 7.6 kB
/* 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'); };