devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
168 lines (164 loc) • 5.55 kB
JavaScript
/**
* DevExtreme (esm/__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/
*/
import defaultDateNames from "../../../common/core/localization/default_date_names";
import {
getFormatter as getLDMLFormatter
} from "../../../common/core/localization/ldml/date.formatter";
import config from "../../../core/config";
import {
isDate,
isNumeric as isNumber,
isString
} from "../../../core/utils/type";
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 (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 = !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 isNumber(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, !config().forceIsoDateParsing)
};
const serializeDate = function(value, serializationFormat) {
if (!serializationFormat) {
return value
}
if (!isDate(value)) {
return null
}
if ("number" === serializationFormat) {
return value && value.valueOf ? value.valueOf() : null
}
return getLDMLFormatter(serializationFormat, defaultDateNames)(value)
};
const getDateSerializationFormat = function(value) {
if ("number" === typeof value) {
return "number"
}
if (isString(value)) {
let format;
if (config().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 = {
dateParser: dateParser,
deserializeDate: deserializeDate,
serializeDate: serializeDate,
getDateSerializationFormat: getDateSerializationFormat
};
export {
dateSerialization
};