devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
144 lines (132 loc) • 5.22 kB
JavaScript
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 y(date, count, useUtc) {
var year = date[useUtc ? "getUTCFullYear" : "getFullYear"]();
if (count === 2) {
year = year % 100;
}
return leftPad(year.toString(), count);
},
M: function M(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 L(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 Q(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 E(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 a(date, count, useUtc, dateParts) {
var hours = date[useUtc ? "getUTCHours" : "getHours"](),
period = hours < 12 ? 0 : 1,
formatType = FORMAT_TYPES[count];
return dateParts.getPeriodNames(formatType)[period];
},
d: function d(date, count, useUtc) {
return leftPad(date[useUtc ? "getUTCDate" : "getDate"]().toString(), Math.min(count, 2));
},
H: function H(date, count, useUtc) {
return leftPad(date[useUtc ? "getUTCHours" : "getHours"]().toString(), Math.min(count, 2));
},
h: function h(date, count, useUtc) {
var hours = date[useUtc ? "getUTCHours" : "getHours"]();
return leftPad((hours % 12 || 12).toString(), Math.min(count, 2));
},
m: function m(date, count, useUtc) {
return leftPad(date[useUtc ? "getUTCMinutes" : "getMinutes"]().toString(), Math.min(count, 2));
},
s: function s(date, count, useUtc) {
return leftPad(date[useUtc ? "getUTCSeconds" : "getSeconds"]().toString(), Math.min(count, 2));
},
S: function S(date, count, useUtc) {
return leftPad(date[useUtc ? "getUTCMilliseconds" : "getMilliseconds"]().toString(), 3).substr(0, count);
},
x: function x(date, count, useUtc) {
var timezoneOffset = useUtc ? 0 : date.getTimezoneOffset(),
signPart = timezoneOffset > 0 ? "-" : "+",
timezoneOffsetAbs = Math.abs(timezoneOffset),
hours = Math.floor(timezoneOffsetAbs / 60),
minutes = timezoneOffsetAbs % 60,
hoursPart = leftPad(hours.toString(), 2),
minutesPart = leftPad(minutes.toString(), 2);
return signPart + hoursPart + (count >= 3 ? ":" : "") + (count > 1 || minutes ? minutesPart : "");
},
X: function X(date, count, useUtc) {
if (useUtc || !date.getTimezoneOffset()) {
return "Z";
}
return LDML_FORMATTERS.x(date, count, useUtc);
},
Z: function Z(date, count, useUtc) {
return LDML_FORMATTERS.X(date, count >= 5 ? 3 : 2, useUtc);
}
};
var getFormatter = function getFormatter(format, dateParts) {
return function (date) {
var charIndex,
formatter,
char,
charCount = 0,
separator = "'",
isEscaping = false,
isCurrentCharEqualsNext,
result = "";
if (!date) return null;
if (!format) return date;
var useUtc = format[format.length - 1] === "Z" || format.slice(-3) === "'Z'";
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 === separator && !isCurrentCharEqualsNext) {
isEscaping = !isEscaping;
} else if (isEscaping || !formatter) {
result += char;
}
if (char === separator && isCurrentCharEqualsNext) {
charIndex++;
}
}
return result;
};
};
module.exports.getFormatter = getFormatter;
;