UNPKG

dtable-utils

Version:

dtable common utils

280 lines (270 loc) 11.1 kB
import _classCallCheck from '@babel/runtime/helpers/classCallCheck'; import _createClass from '@babel/runtime/helpers/createClass'; import { DATE_UNIT, DEFAULT_DATE_FORMAT } from './constants/column.js'; var MONTH_QUARTERS = [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]; var FORMATTING_TOKENS = /(\[[^[]*\])|([-:/.()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g; var MATCH_1_2 = /\d\d?/; // 0 - 99 var MATCH2 = /\d\d/; // 00 - 99 var MATCH4 = /\d{4}/; // 0000 - 9999 var DATE_REG = /[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/; var DATE_WITH_TIME_REG = /[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[01][0-9]):[0-5][0-9]/; var RU_DATE_REG = /^(0[1-9]|[1-2][0-9]|3[0-1])\.(0?[1-9]|1[012])\.\d{4}$/; var RU_TIME_REG = /^(0[1-9]|[1-2][0-9]|3[0-1])\.(0?[1-9]|1[012])\.\d{4} (2[0-3]|[01][0-9]):[0-5][0-9]$/; // month <=12 day <= 9 // month <=12 day >= 13 var US_DATE_REG = /^([1-9]|1[0-2])\/([1-9]|[1-2][3-9]|3[0-1])\/[0-9]{4}$/; var US_TIME_REG = /^([1-9]|1[0-2])\/([1-9]|[1-2][3-9]|3[0-1])\/[0-9]{4} (2[0-3]|[01][0-9]):[0-5][0-9]$/; // 9 < day <= 12 // 9 < month <= 12 var MID_DATE_REG = /^(1[0-2])\/(1[0-2])\/[0-9]{4}$/; var MID_TIME_REG = /^(1[0-2])\/(1[0-2])\/[0-9]{4} (2[0-3]|[01][0-9]):[0-5][0-9]$/; var EU_DATE_REG = /^(0[1-9]|[1-2][0-9]|3[0-1])[\/\.](0?[1-9]|1[012])[\/\.]\d{4}$/; var EU_TIME_REG = /^(0[1-9]|[1-2][0-9]|3[0-1])[\/\.](0?[1-9]|1[012])[\/\.]\d{4} (2[0-3]|[01][0-9]):[0-5][0-9]$/; var MATCHER_EXPRESSIONS = { mm: [MATCH_1_2, DATE_UNIT.MINUTES], HH: [MATCH_1_2, DATE_UNIT.HOURS], D: [MATCH_1_2, DATE_UNIT.DAY], DD: [MATCH2, DATE_UNIT.DAY], M: [MATCH_1_2, DATE_UNIT.MONTH], MM: [MATCH2, DATE_UNIT.MONTH], YYYY: [MATCH4, DATE_UNIT.YEAR] }; var MATCHER_DATE_PARTS = ['YYYY', 'MM', 'M', 'DD', 'D']; var WEEK_DAY_TO_NUM_MAP = { Monday: 1, Saturday: 6, Sunday: 0 }; var DateUtils = /*#__PURE__*/function () { function DateUtils() { _classCallCheck(this, DateUtils); } return _createClass(DateUtils, null, [{ key: "format", value: /** * return the formatted date with target format. * @param {string|date object} date * @param {string} format * @returns formatted date */ function format(date, _format) { var dateObject = this.getValidDate(date); if (!dateObject) { return ''; } var upperCaseFormat = _format && _format.toUpperCase(); var year = dateObject.getFullYear(); var month = dateObject.getMonth() + 1; var day = dateObject.getDate(); var displayMonth = month < 10 ? "0".concat(month) : month; var displayDay = day < 10 ? "0".concat(day) : day; switch (upperCaseFormat) { case 'YYYY-MM-DD HH:MM:SS': { var hours = dateObject.getHours(); var minutes = dateObject.getMinutes(); var seconds = dateObject.getSeconds(); var disPlayHours = hours < 10 ? "0".concat(hours) : hours; var disPlayMinutes = minutes < 10 ? "0".concat(minutes) : minutes; var disPlaySeconds = seconds < 10 ? "0".concat(seconds) : seconds; return "".concat(year, "-").concat(displayMonth, "-").concat(displayDay, " ").concat(disPlayHours, ":").concat(disPlayMinutes, ":").concat(disPlaySeconds); } case 'YYYY-MM-DD HH:MM': { var _hours = dateObject.getHours(); var _minutes = dateObject.getMinutes(); var _disPlayHours = _hours < 10 ? "0".concat(_hours) : _hours; var _disPlayMinutes = _minutes < 10 ? "0".concat(_minutes) : _minutes; return "".concat(year, "-").concat(displayMonth, "-").concat(displayDay, " ").concat(_disPlayHours, ":").concat(_disPlayMinutes); } default: { return "".concat(year, "-").concat(displayMonth, "-").concat(displayDay); } } } /** * returns the formatted date with granularity. * @param {string|date object} date * @param {string} granularity * @param {string} firstDayOfWeek - 'Saturday','Sunday' or 'Monday', default is Sunday * @returns formatted date */ }, { key: "getDateByGranularity", value: function getDateByGranularity(date, granularity, firstDayOfWeek) { var dateObject = this.getValidDate(date); if (!dateObject) { return ''; } var upperCaseGranularity = granularity && granularity.toUpperCase(); var year = dateObject.getFullYear(); switch (upperCaseGranularity) { case 'YEAR': { return "".concat(year); } case 'QUARTAR': { var month = dateObject.getMonth(); var quarter = MONTH_QUARTERS[month]; return "".concat(year, "-Q").concat(quarter); } case 'MONTH': { var _month = dateObject.getMonth() + 1; var displayMonth = _month < 10 ? "0".concat(_month) : _month; return "".concat(year, "-").concat(displayMonth); } case 'WEEK': { var firstDayOfWeekNum = firstDayOfWeek ? WEEK_DAY_TO_NUM_MAP[firstDayOfWeek] || 0 : 0; var weekNum = dateObject.getDay(); var daysToFirstDay = (weekNum - firstDayOfWeekNum + 7) % 7; var startOfWeekDay = dateObject.getDate() - daysToFirstDay; var startOfWeekDate = new Date(year, dateObject.getMonth(), startOfWeekDay); var _month2 = startOfWeekDate.getMonth() + 1; var day = startOfWeekDate.getDate(); var _displayMonth = _month2 < 10 ? "0".concat(_month2) : _month2; var displayDay = day < 10 ? "0".concat(day) : day; return "".concat(startOfWeekDate.getFullYear(), "-").concat(_displayMonth, "-").concat(displayDay); } case 'DAY': { var _month3 = dateObject.getMonth() + 1; var _day = dateObject.getDate(); var _displayMonth2 = _month3 < 10 ? "0".concat(_month3) : _month3; var _displayDay = _day < 10 ? "0".concat(_day) : _day; return "".concat(year, "-").concat(_displayMonth2, "-").concat(_displayDay); } default: { return ''; } } } }, { key: "isValidDateObject", value: function isValidDateObject(dateObject) { return dateObject instanceof Date && !isNaN(dateObject.getTime()); } }, { key: "getValidDate", value: function getValidDate(date) { if (!date) { return null; } var isDateTypeString = typeof date === 'string'; var dateString = date; var dateObject = date; if (isDateTypeString) { if (dateString.split(' ').length > 1 || dateString.includes('T')) { dateObject = new Date(date); } else { // given date is without time precision // parse with ISO 8601 date format dateString = "".concat(date, "T00:00:00"); dateObject = new Date(dateString); // try to parse other date format: DD/MM/YYYY if (!this.isValidDateObject(dateObject)) { dateObject = new Date(date); } } } if (this.isValidDateObject(dateObject)) return dateObject; if (!isDateTypeString) return null; // ios phone and safari browser not support use '2021-09-10 12:30', support '2021/09/10 12:30' dateObject = new Date(dateString.replace(/-/g, '/')); if (this.isValidDateObject(dateObject)) return dateObject; return null; } /** * @param {string} dateString * @param {string} format * @returns Date Object */ }, { key: "parseDateWithFormat", value: function parseDateWithFormat(dateString, format) { var newFormat = format; if (dateString.includes('T')) { // ISO 8601 format with "T" separator directly using Date object var dateObj = new Date(dateString); return this.isValidDateObject(dateObj) ? dateObj : this.getValidDate(dateString); } if (dateString.match(DATE_REG) || dateString.match(DATE_WITH_TIME_REG)) { newFormat = format.indexOf('HH:mm') > -1 ? "".concat(DEFAULT_DATE_FORMAT, " HH:mm") : DEFAULT_DATE_FORMAT; } if (dateString.match(RU_DATE_REG) || dateString.match(RU_TIME_REG)) { newFormat = format.indexOf('HH:mm') > -1 ? 'DD.MM.YYYY HH:mm' : 'DD.MM.YYYY'; } var isUSDate = dateString.match(US_DATE_REG) || dateString.match(US_TIME_REG); if (isUSDate) { newFormat = format.indexOf('HH:mm') > -1 ? 'M/D/YYYY HH:mm' : 'M/D/YYYY'; } var isEUDate = dateString.match(EU_DATE_REG) || dateString.match(EU_TIME_REG); var isUsOrEuDate = dateString.match(MID_DATE_REG) || dateString.match(MID_TIME_REG); var isUSFormat = ['M/D/YYYY HH:mm', 'M/D/YYYY'].includes(newFormat); if (isUsOrEuDate && isUSFormat) { newFormat = format.indexOf('HH:mm') > -1 ? 'M/D/YYYY HH:mm' : 'M/D/YYYY'; } else if (isEUDate) { newFormat = format.indexOf('HH:mm') > -1 ? 'DD/MM/YYYY HH:mm' : 'DD/MM/YYYY'; } try { var parser = this.makeParser(newFormat); var _parser = parser(dateString), year = _parser.year, month = _parser.month, day = _parser.day, hours = _parser.hours, minutes = _parser.minutes; if (!year) { var nowDate = new Date(); year = nowDate.getFullYear(); } var _dateObj = new Date("".concat(year, "-").concat(month, "-").concat(day, "T").concat(hours || '00', ":").concat(minutes || '00', ":00")); if (!this.isValidDateObject(_dateObj)) { return this.getValidDate(dateString); } return _dateObj; } catch (err) { return this.getValidDate(dateString); } } }, { key: "makeParser", value: function makeParser(format) { // 'YYYY-MM-DD HH:mm'.match(formattingTokens): // ['YYYY', '-', 'MM', '-', 'DD', ' ', 'HH', ':', 'mm'] var tokens = (format || DEFAULT_DATE_FORMAT).match(FORMATTING_TOKENS); var formatPartsLength = tokens.length; return function (dateString) { var dateParts = dateString.split(' '); var datePart = dateParts[0] || ''; var timePart = dateParts[1] || ''; var time = {}; for (var i = 0; i < formatPartsLength; i++) { var token = tokens[i]; var parseTo = MATCHER_EXPRESSIONS[token]; if (!parseTo) continue; var regex = parseTo[0]; var parserType = parseTo[1]; if (!parserType) continue; var isDatePart = MATCHER_DATE_PARTS.includes(token); var match = isDatePart ? regex.exec(datePart) : regex.exec(timePart); if (!match) continue; var value = match[0]; time[parserType] = value; if (isDatePart) { datePart = datePart.replace(value, ''); } else { timePart = timePart.replace(value, ''); } } return time; }; } }]); }(); export { DateUtils };