123 lines
No EOL
5.1 KiB
JavaScript
123 lines
No EOL
5.1 KiB
JavaScript
define(["globalize"], function(globalize) {
|
|
"use strict";
|
|
|
|
function parseISO8601Date(s, toLocal) {
|
|
var re = /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\.\d+)?(Z|([+-])(\d{2}):(\d{2}))?/,
|
|
d = s.match(re);
|
|
if (!d) throw "Couldn't parse ISO 8601 date string '" + s + "'";
|
|
var a = [1, 2, 3, 4, 5, 6, 10, 11];
|
|
for (var i in a) d[a[i]] = parseInt(d[a[i]], 10);
|
|
d[7] = parseFloat(d[7]);
|
|
var ms = Date.UTC(d[1], d[2] - 1, d[3], d[4], d[5], d[6]);
|
|
if (d[7] > 0 && (ms += Math.round(1e3 * d[7])), "Z" !== d[8] && d[10]) {
|
|
var offset = 60 * d[10] * 60 * 1e3;
|
|
d[11] && (offset += 60 * d[11] * 1e3), "-" === d[9] ? ms -= offset : ms += offset
|
|
} else !1 === toLocal && (ms += 6e4 * (new Date).getTimezoneOffset());
|
|
return new Date(ms)
|
|
}
|
|
|
|
function getDisplayRunningTime(ticks) {
|
|
var parts = [],
|
|
hours = ticks / 36e9;
|
|
hours = Math.floor(hours), hours && parts.push(hours), ticks -= 36e9 * hours;
|
|
var minutes = ticks / 6e8;
|
|
minutes = Math.floor(minutes), ticks -= 6e8 * minutes, minutes < 10 && hours && (minutes = "0" + minutes), parts.push(minutes);
|
|
var seconds = ticks / 1e7;
|
|
return seconds = Math.floor(seconds), seconds < 10 && (seconds = "0" + seconds), parts.push(seconds), parts.join(":")
|
|
}
|
|
|
|
function getOptionList(options) {
|
|
var list = [];
|
|
for (var i in options) list.push({
|
|
name: i,
|
|
value: options[i]
|
|
});
|
|
return list
|
|
}
|
|
|
|
function toLocaleString(date, options) {
|
|
if (!date) throw new Error("date cannot be null");
|
|
if (options = options || {}, toLocaleTimeStringSupportsLocales) {
|
|
var currentLocale = globalize.getCurrentDateTimeLocale();
|
|
if (currentLocale) return date.toLocaleString(currentLocale, options)
|
|
}
|
|
return date.toLocaleString()
|
|
}
|
|
|
|
function toLocaleDateString(date, options) {
|
|
if (!date) throw new Error("date cannot be null");
|
|
if (options = options || {}, toLocaleTimeStringSupportsLocales) {
|
|
var currentLocale = globalize.getCurrentDateTimeLocale();
|
|
if (currentLocale) return date.toLocaleDateString(currentLocale, options)
|
|
}
|
|
var optionList = getOptionList(options);
|
|
if (1 === optionList.length && "weekday" === optionList[0].name) {
|
|
var weekday = [];
|
|
return weekday[0] = "Sun", weekday[1] = "Mon", weekday[2] = "Tue", weekday[3] = "Wed", weekday[4] = "Thu", weekday[5] = "Fri", weekday[6] = "Sat", weekday[date.getDay()]
|
|
}
|
|
return date.toLocaleDateString()
|
|
}
|
|
|
|
function toLocaleTimeString(date, options) {
|
|
if (!date) throw new Error("date cannot be null");
|
|
if (options = options || {}, toLocaleTimeStringSupportsLocales) {
|
|
var currentLocale = globalize.getCurrentDateTimeLocale();
|
|
if (currentLocale) return date.toLocaleTimeString(currentLocale, options)
|
|
}
|
|
return date.toLocaleTimeString()
|
|
}
|
|
|
|
function getDisplayTime(date) {
|
|
if (!date) throw new Error("date cannot be null");
|
|
if ("string" === (typeof date).toString().toLowerCase()) try {
|
|
date = parseISO8601Date(date, !0)
|
|
} catch (err) {
|
|
return date
|
|
}
|
|
if (toLocaleTimeStringSupportsLocales) return toLocaleTimeString(date, {
|
|
hour: "numeric",
|
|
minute: "2-digit"
|
|
});
|
|
var time = toLocaleTimeString(date),
|
|
timeLower = time.toLowerCase();
|
|
if (-1 !== timeLower.indexOf("am") || -1 !== timeLower.indexOf("pm")) {
|
|
time = timeLower;
|
|
var hour = date.getHours() % 12,
|
|
suffix = date.getHours() > 11 ? "pm" : "am";
|
|
hour || (hour = 12);
|
|
var minutes = date.getMinutes();
|
|
minutes < 10 && (minutes = "0" + minutes), minutes = ":" + minutes, time = hour + minutes + suffix
|
|
} else {
|
|
var timeParts = time.split(":");
|
|
timeParts.length > 2 && (timeParts.length = 2, time = timeParts.join(":"))
|
|
}
|
|
return time
|
|
}
|
|
|
|
function isRelativeDay(date, offsetInDays) {
|
|
if (!date) throw new Error("date cannot be null");
|
|
var yesterday = new Date,
|
|
day = yesterday.getDate() + offsetInDays;
|
|
return yesterday.setDate(day), date.getFullYear() === yesterday.getFullYear() && date.getMonth() === yesterday.getMonth() && date.getDate() === day
|
|
}
|
|
var toLocaleTimeStringSupportsLocales = function() {
|
|
try {
|
|
(new Date).toLocaleTimeString("i")
|
|
} catch (e) {
|
|
return "RangeError" === e.name
|
|
}
|
|
return !1
|
|
}();
|
|
return {
|
|
parseISO8601Date: parseISO8601Date,
|
|
getDisplayRunningTime: getDisplayRunningTime,
|
|
toLocaleDateString: toLocaleDateString,
|
|
toLocaleString: toLocaleString,
|
|
getDisplayTime: getDisplayTime,
|
|
isRelativeDay: isRelativeDay,
|
|
toLocaleTimeString: toLocaleTimeString,
|
|
supportsLocalization: function() {
|
|
return toLocaleTimeStringSupportsLocales
|
|
}
|
|
}
|
|
}); |