date-time.js
来自「javascript实现的关于时间线的简单例子。」· JavaScript 代码 · 共 453 行 · 第 1/2 页
JS
453 行
/**
* @fileOverview A collection of date/time utility functions
* @name SimileAjax.DateTime
*/
SimileAjax.DateTime = new Object();
SimileAjax.DateTime.MILLISECOND = 0;
SimileAjax.DateTime.SECOND = 1;
SimileAjax.DateTime.MINUTE = 2;
SimileAjax.DateTime.HOUR = 3;
SimileAjax.DateTime.DAY = 4;
SimileAjax.DateTime.WEEK = 5;
SimileAjax.DateTime.MONTH = 6;
SimileAjax.DateTime.YEAR = 7;
SimileAjax.DateTime.DECADE = 8;
SimileAjax.DateTime.CENTURY = 9;
SimileAjax.DateTime.MILLENNIUM = 10;
SimileAjax.DateTime.EPOCH = -1;
SimileAjax.DateTime.ERA = -2;
/**
* An array of unit lengths, expressed in milliseconds, of various lengths of
* time. The array indices are predefined and stored as properties of the
* SimileAjax.DateTime object, e.g. SimileAjax.DateTime.YEAR.
* @type Array
*/
SimileAjax.DateTime.gregorianUnitLengths = [];
(function() {
var d = SimileAjax.DateTime;
var a = d.gregorianUnitLengths;
a[d.MILLISECOND] = 1;
a[d.SECOND] = 1000;
a[d.MINUTE] = a[d.SECOND] * 60;
a[d.HOUR] = a[d.MINUTE] * 60;
a[d.DAY] = a[d.HOUR] * 24;
a[d.WEEK] = a[d.DAY] * 7;
a[d.MONTH] = a[d.DAY] * 31;
a[d.YEAR] = a[d.DAY] * 365;
a[d.DECADE] = a[d.YEAR] * 10;
a[d.CENTURY] = a[d.YEAR] * 100;
a[d.MILLENNIUM] = a[d.YEAR] * 1000;
})();
SimileAjax.DateTime._dateRegexp = new RegExp(
"^(-?)([0-9]{4})(" + [
"(-?([0-9]{2})(-?([0-9]{2}))?)", // -month-dayOfMonth
"(-?([0-9]{3}))", // -dayOfYear
"(-?W([0-9]{2})(-?([1-7]))?)" // -Wweek-dayOfWeek
].join("|") + ")?$"
);
SimileAjax.DateTime._timezoneRegexp = new RegExp(
"Z|(([-+])([0-9]{2})(:?([0-9]{2}))?)$"
);
SimileAjax.DateTime._timeRegexp = new RegExp(
"^([0-9]{2})(:?([0-9]{2})(:?([0-9]{2})(\.([0-9]+))?)?)?$"
);
/**
* Takes a date object and a string containing an ISO 8601 date and sets the
* the date using information parsed from the string. Note that this method
* does not parse any time information.
*
* @param {Date} dateObject the date object to modify
* @param {String} string an ISO 8601 string to parse
* @return {Date} the modified date object
*/
SimileAjax.DateTime.setIso8601Date = function(dateObject, string) {
/*
* This function has been adapted from dojo.date, v.0.3.0
* http://dojotoolkit.org/.
*/
var d = string.match(SimileAjax.DateTime._dateRegexp);
if(!d) {
throw new Error("Invalid date string: " + string);
}
var sign = (d[1] == "-") ? -1 : 1; // BC or AD
var year = sign * d[2];
var month = d[5];
var date = d[7];
var dayofyear = d[9];
var week = d[11];
var dayofweek = (d[13]) ? d[13] : 1;
dateObject.setUTCFullYear(year);
if (dayofyear) {
dateObject.setUTCMonth(0);
dateObject.setUTCDate(Number(dayofyear));
} else if (week) {
dateObject.setUTCMonth(0);
dateObject.setUTCDate(1);
var gd = dateObject.getUTCDay();
var day = (gd) ? gd : 7;
var offset = Number(dayofweek) + (7 * Number(week));
if (day <= 4) {
dateObject.setUTCDate(offset + 1 - day);
} else {
dateObject.setUTCDate(offset + 8 - day);
}
} else {
if (month) {
dateObject.setUTCDate(1);
dateObject.setUTCMonth(month - 1);
}
if (date) {
dateObject.setUTCDate(date);
}
}
return dateObject;
};
/**
* Takes a date object and a string containing an ISO 8601 time and sets the
* the time using information parsed from the string. Note that this method
* does not parse any date information.
*
* @param {Date} dateObject the date object to modify
* @param {String} string an ISO 8601 string to parse
* @return {Date} the modified date object
*/
SimileAjax.DateTime.setIso8601Time = function (dateObject, string) {
/*
* This function has been adapted from dojo.date, v.0.3.0
* http://dojotoolkit.org/.
*/
var d = string.match(SimileAjax.DateTime._timeRegexp);
if(!d) {
SimileAjax.Debug.warn("Invalid time string: " + string);
return false;
}
var hours = d[1];
var mins = Number((d[3]) ? d[3] : 0);
var secs = (d[5]) ? d[5] : 0;
var ms = d[7] ? (Number("0." + d[7]) * 1000) : 0;
dateObject.setUTCHours(hours);
dateObject.setUTCMinutes(mins);
dateObject.setUTCSeconds(secs);
dateObject.setUTCMilliseconds(ms);
return dateObject;
};
/**
* The timezone offset in minutes in the user's browser.
* @type Number
*/
SimileAjax.DateTime.timezoneOffset = new Date().getTimezoneOffset();
/**
* Takes a date object and a string containing an ISO 8601 date and time and
* sets the date object using information parsed from the string.
*
* @param {Date} dateObject the date object to modify
* @param {String} string an ISO 8601 string to parse
* @return {Date} the modified date object
*/
SimileAjax.DateTime.setIso8601 = function (dateObject, string){
/*
* This function has been adapted from dojo.date, v.0.3.0
* http://dojotoolkit.org/.
*/
var offset = null;
var comps = (string.indexOf("T") == -1) ? string.split(" ") : string.split("T");
SimileAjax.DateTime.setIso8601Date(dateObject, comps[0]);
if (comps.length == 2) {
// first strip timezone info from the end
var d = comps[1].match(SimileAjax.DateTime._timezoneRegexp);
if (d) {
if (d[0] == 'Z') {
offset = 0;
} else {
offset = (Number(d[3]) * 60) + Number(d[5]);
offset *= ((d[2] == '-') ? 1 : -1);
}
comps[1] = comps[1].substr(0, comps[1].length - d[0].length);
}
SimileAjax.DateTime.setIso8601Time(dateObject, comps[1]);
}
if (offset == null) {
offset = dateObject.getTimezoneOffset(); // local time zone if no tz info
}
dateObject.setTime(dateObject.getTime() + offset * 60000);
return dateObject;
};
/**
* Takes a string containing an ISO 8601 date and returns a newly instantiated
* date object with the parsed date and time information from the string.
*
* @param {String} string an ISO 8601 string to parse
* @return {Date} a new date object created from the string
*/
SimileAjax.DateTime.parseIso8601DateTime = function (string) {
try {
return SimileAjax.DateTime.setIso8601(new Date(0), string);
} catch (e) {
return null;
}
};
/**
* Takes a string containing a Gregorian date and time and returns a newly
* instantiated date object with the parsed date and time information from the
* string. If the param is actually an instance of Date instead of a string,
* simply returns the given date instead.
*
* @param {Object} o an object, to either return or parse as a string
* @return {Date} the date object
*/
SimileAjax.DateTime.parseGregorianDateTime = function(o) {
if (o == null) {
return null;
} else if (o instanceof Date) {
return o;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?