devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
142 lines (141 loc) • 5.49 kB
JavaScript
/**
* DevExtreme (esm/localization/ldml/date.formatter.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/
*/
function leftPad(text, length) {
while (text.length < length) {
text = "0" + text
}
return text
}
var FORMAT_TYPES = {
3: "abbreviated",
4: "wide",
5: "narrow"
};
var LDML_FORMATTERS = {
y: function(date, count, useUtc) {
var year = date[useUtc ? "getUTCFullYear" : "getFullYear"]();
if (2 === count) {
year %= 100
}
return leftPad(year.toString(), count)
},
M: function(date, count, useUtc, dateParts) {
var month = date[useUtc ? "getUTCMonth" : "getMonth"]();
var formatType = FORMAT_TYPES[count];
if (formatType) {
return dateParts.getMonthNames(formatType, "format")[month]
}
return leftPad((month + 1).toString(), Math.min(count, 2))
},
L: function(date, count, useUtc, dateParts) {
var month = date[useUtc ? "getUTCMonth" : "getMonth"]();
var formatType = FORMAT_TYPES[count];
if (formatType) {
return dateParts.getMonthNames(formatType, "standalone")[month]
}
return leftPad((month + 1).toString(), Math.min(count, 2))
},
Q: function(date, count, useUtc, dateParts) {
var month = date[useUtc ? "getUTCMonth" : "getMonth"]();
var quarter = Math.floor(month / 3);
var formatType = FORMAT_TYPES[count];
if (formatType) {
return dateParts.getQuarterNames(formatType)[quarter]
}
return leftPad((quarter + 1).toString(), Math.min(count, 2))
},
E: function(date, count, useUtc, dateParts) {
var day = date[useUtc ? "getUTCDay" : "getDay"]();
var formatType = FORMAT_TYPES[count < 3 ? 3 : count];
return dateParts.getDayNames(formatType)[day]
},
a: function(date, count, useUtc, dateParts) {
var hours = date[useUtc ? "getUTCHours" : "getHours"]();
var period = hours < 12 ? 0 : 1;
var formatType = FORMAT_TYPES[count];
return dateParts.getPeriodNames(formatType)[period]
},
d: function(date, count, useUtc) {
return leftPad(date[useUtc ? "getUTCDate" : "getDate"]().toString(), Math.min(count, 2))
},
H: function(date, count, useUtc) {
return leftPad(date[useUtc ? "getUTCHours" : "getHours"]().toString(), Math.min(count, 2))
},
h: function(date, count, useUtc) {
var hours = date[useUtc ? "getUTCHours" : "getHours"]();
return leftPad((hours % 12 || 12).toString(), Math.min(count, 2))
},
m: function(date, count, useUtc) {
return leftPad(date[useUtc ? "getUTCMinutes" : "getMinutes"]().toString(), Math.min(count, 2))
},
s: function(date, count, useUtc) {
return leftPad(date[useUtc ? "getUTCSeconds" : "getSeconds"]().toString(), Math.min(count, 2))
},
S: function(date, count, useUtc) {
return leftPad(date[useUtc ? "getUTCMilliseconds" : "getMilliseconds"]().toString(), 3).substr(0, count)
},
x: function(date, count, useUtc) {
var timezoneOffset = useUtc ? 0 : date.getTimezoneOffset();
var signPart = timezoneOffset > 0 ? "-" : "+";
var timezoneOffsetAbs = Math.abs(timezoneOffset);
var hours = Math.floor(timezoneOffsetAbs / 60);
var minutes = timezoneOffsetAbs % 60;
var hoursPart = leftPad(hours.toString(), 2);
var minutesPart = leftPad(minutes.toString(), 2);
return signPart + hoursPart + (count >= 3 ? ":" : "") + (count > 1 || minutes ? minutesPart : "")
},
X: function(date, count, useUtc) {
if (useUtc || !date.getTimezoneOffset()) {
return "Z"
}
return LDML_FORMATTERS.x(date, count, useUtc)
},
Z: function(date, count, useUtc) {
return LDML_FORMATTERS.X(date, count >= 5 ? 3 : 2, useUtc)
}
};
export var getFormatter = function(format, dateParts) {
return function(date) {
var charIndex;
var formatter;
var char;
var charCount = 0;
var isEscaping = false;
var isCurrentCharEqualsNext;
var result = "";
if (!date) {
return null
}
if (!format) {
return date
}
var useUtc = "Z" === format[format.length - 1] || "'Z'" === format.slice(-3);
for (charIndex = 0; charIndex < format.length; charIndex++) {
char = format[charIndex];
formatter = LDML_FORMATTERS[char];
isCurrentCharEqualsNext = char === format[charIndex + 1];
charCount++;
if (!isCurrentCharEqualsNext) {
if (formatter && !isEscaping) {
result += formatter(date, charCount, useUtc, dateParts)
}
charCount = 0
}
if ("'" === char && !isCurrentCharEqualsNext) {
isEscaping = !isEscaping
} else if (isEscaping || !formatter) {
result += char
}
if ("'" === char && isCurrentCharEqualsNext) {
charIndex++
}
}
return result
}
};