dtable-utils
Version:
dtable common utils
266 lines (257 loc) • 10.6 kB
JavaScript
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 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
* @returns formatted date
*/
}, {
key: "getDateByGranularity",
value: function getDateByGranularity(date, granularity) {
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 weekNum = dateObject.getDay();
var startOfWeekDay = dateObject.getDate() + (weekNum === 0 ? -6 : 1 - weekNum);
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
dateString = "".concat(date, " 00:00:00");
dateObject = new Date(dateString);
}
}
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, " ").concat(hours || '00', ":").concat(minutes || '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 };