devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
170 lines (165 loc) • 5.84 kB
JavaScript
/**
* DevExtreme (cjs/__internal/core/utils/m_date_serialization.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.dateSerialization = void 0;
var _default_date_names = _interopRequireDefault(require("../../../common/core/localization/default_date_names"));
var _date = require("../../../common/core/localization/ldml/date.formatter");
var _config = _interopRequireDefault(require("../../../core/config"));
var _type = require("../../../core/utils/type");
function _interopRequireDefault(e) {
return e && e.__esModule ? e : {
default: e
}
}
const NUMBER_SERIALIZATION_FORMAT = "number";
const DATE_SERIALIZATION_FORMAT = "yyyy/MM/dd";
const DATETIME_SERIALIZATION_FORMAT = "yyyy/MM/dd HH:mm:ss";
const ISO8601_PATTERN = /^(\d{4,})(-)?(\d{2})(-)?(\d{2})(?:T(\d{2})(:)?(\d{2})?(:)?(\d{2}(?:\.(\d{1,3})\d*)?)?)?(Z|([+-])(\d{2})(:)?(\d{2})?)?$/;
const ISO8601_TIME_PATTERN = /^(\d{2}):(\d{2})(:(\d{2}))?$/;
const ISO8601_PATTERN_PARTS = ["", "yyyy", "", "MM", "", "dd", "THH", "", "mm", "", "ss", ".SSS"];
const DATE_SERIALIZATION_PATTERN = /^(\d{4})\/(\d{2})\/(\d{2})$/;
const MILLISECOND_LENGHT = 3;
const dateParser = function(text, skipISO8601Parsing) {
let result;
if ((0, _type.isString)(text) && !skipISO8601Parsing) {
result = parseISO8601String(text)
}
return result || parseDate(text)
};
function getTimePart(part) {
return +part || 0
}
function parseDate(text) {
const isDefaultSerializationFormat = "yyyy/MM/dd" === getDateSerializationFormat(text);
const parsedValue = !(0, _type.isDate)(text) && Date.parse(text);
if (!parsedValue && isDefaultSerializationFormat) {
const parts = text.match(DATE_SERIALIZATION_PATTERN);
if (parts) {
const newDate = new Date(getTimePart(parts[1]), getTimePart(parts[2]), getTimePart(parts[3]));
newDate.setFullYear(getTimePart(parts[1]));
newDate.setMonth(getTimePart(parts[2]) - 1);
newDate.setDate(getTimePart(parts[3]));
return newDate
}
}
return (0, _type.isNumeric)(parsedValue) ? new Date(parsedValue) : text
}
function parseISO8601String(text) {
let parts = text.match(ISO8601_PATTERN);
if (!parts) {
parts = text.match(ISO8601_TIME_PATTERN);
if (parts) {
return new Date(0, 0, 0, getTimePart(parts[1]), getTimePart(parts[2]), getTimePart(parts[4]))
}
return
}
const year = getTimePart(parts[1]);
const month = --parts[3];
const day = parts[5];
let timeZoneHour = 0;
let timeZoneMinute = 0;
const correctYear = d => {
year < 100 && d.setFullYear(year);
return d
};
timeZoneHour = getTimePart(parts[14]);
timeZoneMinute = getTimePart(parts[16]);
if ("-" === parts[13]) {
timeZoneHour = -timeZoneHour;
timeZoneMinute = -timeZoneMinute
}
const hour = getTimePart(parts[6]) - timeZoneHour;
const minute = getTimePart(parts[8]) - timeZoneMinute;
const second = getTimePart(parts[10]);
const millisecond = function(part) {
part = part || "";
return getTimePart(part) * 10 ** (3 - part.length)
}(parts[11]);
if (parts[12]) {
return correctYear(new Date(Date.UTC(year, month, day, hour, minute, second, millisecond)))
}
return correctYear(new Date(year, month, day, hour, minute, second, millisecond))
}
const getIso8601Format = function(text, useUtc) {
let parts = text.match(ISO8601_PATTERN);
let result = "";
if (!parts) {
parts = text.match(ISO8601_TIME_PATTERN);
if (parts) {
return parts[3] ? "HH:mm:ss" : "HH:mm"
}
return
}
for (let i = 1; i < ISO8601_PATTERN_PARTS.length; i++) {
if (parts[i]) {
result += ISO8601_PATTERN_PARTS[i] || parts[i]
}
}
if ("Z" === parts[12]) {
result += "'Z'"
}
if (parts[14]) {
if (parts[15]) {
result += "xxx"
} else if (parts[16]) {
result += "xx"
} else {
result += "x"
}
}
return result
};
const deserializeDate = function(value) {
if ("number" === typeof value) {
return new Date(value)
}
return dateParser(value, !(0, _config.default)().forceIsoDateParsing)
};
const serializeDate = function(value, serializationFormat) {
if (!serializationFormat) {
return value
}
if (!(0, _type.isDate)(value)) {
return null
}
if ("number" === serializationFormat) {
return value && value.valueOf ? value.valueOf() : null
}
return (0, _date.getFormatter)(serializationFormat, _default_date_names.default)(value)
};
const getDateSerializationFormat = function(value) {
if ("number" === typeof value) {
return "number"
}
if ((0, _type.isString)(value)) {
let format;
if ((0, _config.default)().forceIsoDateParsing) {
format = getIso8601Format(value)
}
if (format) {
return format
}
if (value.includes(":")) {
return "yyyy/MM/dd HH:mm:ss"
}
return "yyyy/MM/dd"
}
if (value) {
return null
}
};
const dateSerialization = exports.dateSerialization = {
dateParser: dateParser,
deserializeDate: deserializeDate,
serializeDate: serializeDate,
getDateSerializationFormat: getDateSerializationFormat
};