devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
168 lines (135 loc) • 4.63 kB
JavaScript
var config = require("../config"),
getLDMLFormatter = require("../../localization/ldml/date.formatter").getFormatter,
defaultDateNames = require("../../localization/default_date_names"),
typeUtils = require("./type"),
isString = typeUtils.isString,
isDate = typeUtils.isDate,
isNumber = typeUtils.isNumeric;
var NUMBER_SERIALIZATION_FORMAT = "number",
DATE_SERIALIZATION_FORMAT = "yyyy/MM/dd",
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 MILLISECOND_LENGHT = 3;
var dateParser = function dateParser(text, skipISO8601Parsing) {
var result;
var parsedValue;
if (isString(text) && !skipISO8601Parsing) {
result = parseISO8601String(text);
}
if (!result) {
parsedValue = !isDate(text) && Date.parse(text);
result = isNumber(parsedValue) ? new Date(parsedValue) : text;
}
return result;
};
var parseISO8601String = function parseISO8601String(text) {
var parts = text.match(ISO8601_PATTERN);
var timePart = function timePart(part) {
return +part || 0;
};
if (!parts) {
parts = text.match(ISO8601_TIME_PATTERN);
if (parts) {
return new Date(0, 0, 0, timePart(parts[1]), timePart(parts[2]), timePart(parts[4]));
}
return;
}
var year = parts[1],
month = --parts[3],
day = parts[5],
timeZoneHour = 0,
timeZoneMinute = 0;
timeZoneHour = timePart(parts[14]);
timeZoneMinute = timePart(parts[16]);
if (parts[13] === "-") {
timeZoneHour = -timeZoneHour;
timeZoneMinute = -timeZoneMinute;
}
var hour = timePart(parts[6]) - timeZoneHour,
minute = timePart(parts[8]) - timeZoneMinute,
second = timePart(parts[10]),
parseMilliseconds = function parseMilliseconds(part) {
part = part || "";
return timePart(part) * Math.pow(10, MILLISECOND_LENGHT - part.length);
},
millisecond = parseMilliseconds(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 getIso8601Format(text, useUtc) {
var parts = text.match(ISO8601_PATTERN),
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 (parts[12] === "Z") {
result += "'Z'";
}
if (parts[14]) {
if (parts[15]) {
result += "xxx";
} else if (parts[16]) {
result += "xx";
} else {
result += "x";
}
}
return result;
};
var deserializeDate = function deserializeDate(value) {
if (typeof value === "number") {
return new Date(value);
}
return dateParser(value, !config().forceIsoDateParsing);
};
var serializeDate = function serializeDate(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 getDateSerializationFormat(value) {
if (typeof value === "number") {
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;
}
};
module.exports = {
dateParser: dateParser,
deserializeDate: deserializeDate,
serializeDate: serializeDate,
getDateSerializationFormat: getDateSerializationFormat
};
;