UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

161 lines (157 loc) • 5.46 kB
/** * DevExtreme (esm/core/utils/date_serialization.js) * Version: 21.1.4 * Build date: Mon Jun 21 2021 * * Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ import config from "../config"; import { getFormatter as getLDMLFormatter } from "../../localization/ldml/date.formatter"; import defaultDateNames from "../../localization/default_date_names"; import { isString, isDate, isNumeric as isNumber } from "./type"; import browser from "./browser"; var NUMBER_SERIALIZATION_FORMAT = "number"; var DATE_SERIALIZATION_FORMAT = "yyyy/MM/dd"; var DATETIME_SERIALIZATION_FORMAT = "yyyy/MM/dd HH:mm:ss"; var ISO8601_PATTERN = /^(\d{4,})(-)?(\d{2})(-)?(\d{2})(?:T(\d{2})(:)?(\d{2})?(:)?(\d{2}(?:\.(\d{1,3})\d*)?)?)?(Z|([+-])(\d{2})(:)?(\d{2})?)?$/; var ISO8601_TIME_PATTERN = /^(\d{2}):(\d{2})(:(\d{2}))?$/; var ISO8601_PATTERN_PARTS = ["", "yyyy", "", "MM", "", "dd", "THH", "", "mm", "", "ss", ".SSS"]; var DATE_SERIALIZATION_PATTERN = /^(\d{4})\/(\d{2})\/(\d{2})$/; var MILLISECOND_LENGHT = 3; var isIE11 = browser.msie && parseInt(browser.version) <= 11; var dateParser = function(text, skipISO8601Parsing) { var result; if (isString(text) && !skipISO8601Parsing) { result = parseISO8601String(text) } return result || parseDate(text) }; function getTimePart(part) { return +part || 0 } function parseDate(text) { var isDefaultSerializationFormat = getDateSerializationFormat(text) === DATE_SERIALIZATION_FORMAT; var parsedValue = !isDate(text) && Date.parse(text); if ((!parsedValue || isIE11) && isDefaultSerializationFormat) { var parts = text.match(DATE_SERIALIZATION_PATTERN); if (parts) { var 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) { var 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 } var year = parts[1]; var month = --parts[3]; var day = parts[5]; var timeZoneHour = 0; var timeZoneMinute = 0; timeZoneHour = getTimePart(parts[14]); timeZoneMinute = getTimePart(parts[16]); if ("-" === parts[13]) { timeZoneHour = -timeZoneHour; timeZoneMinute = -timeZoneMinute } var hour = getTimePart(parts[6]) - timeZoneHour; var minute = getTimePart(parts[8]) - timeZoneMinute; var second = getTimePart(parts[10]); var millisecond = function(part) { part = part || ""; return getTimePart(part) * Math.pow(10, MILLISECOND_LENGHT - part.length) }(parts[11]); if (parts[12]) { return new Date(Date.UTC(year, month, day, hour, minute, second, millisecond)) } return new Date(year, month, day, hour, minute, second, millisecond) } var getIso8601Format = function(text, useUtc) { var parts = text.match(ISO8601_PATTERN); var result = ""; if (!parts) { parts = text.match(ISO8601_TIME_PATTERN); if (parts) { return parts[3] ? "HH:mm:ss" : "HH:mm" } return } for (var 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 }; var deserializeDate = function(value) { if ("number" === typeof value) { return new Date(value) } return dateParser(value, !config().forceIsoDateParsing) }; var serializeDate = function(value, serializationFormat) { if (!serializationFormat) { return value } if (!isDate(value)) { return null } if (serializationFormat === NUMBER_SERIALIZATION_FORMAT) { return value && value.valueOf ? value.valueOf() : null } return getLDMLFormatter(serializationFormat, defaultDateNames)(value) }; var getDateSerializationFormat = function(value) { if ("number" === typeof value) { return NUMBER_SERIALIZATION_FORMAT } else if (isString(value)) { var format; if (config().forceIsoDateParsing) { format = getIso8601Format(value) } if (format) { return format } else if (value.indexOf(":") >= 0) { return DATETIME_SERIALIZATION_FORMAT } else { return DATE_SERIALIZATION_FORMAT } } else if (value) { return null } }; export default { dateParser: dateParser, deserializeDate: deserializeDate, serializeDate: serializeDate, getDateSerializationFormat: getDateSerializationFormat };