date-time.js
来自「javascript实现的关于时间线的简单例子。」· JavaScript 代码 · 共 453 行 · 第 1/2 页
JS
453 行
var s = o.toString();
if (s.length > 0 && s.length < 8) {
var space = s.indexOf(" ");
if (space > 0) {
var year = parseInt(s.substr(0, space));
var suffix = s.substr(space + 1);
if (suffix.toLowerCase() == "bc") {
year = 1 - year;
}
} else {
var year = parseInt(s);
}
var d = new Date(0);
d.setUTCFullYear(year);
return d;
}
try {
return new Date(Date.parse(s));
} catch (e) {
return null;
}
};
/**
* Rounds date objects down to the nearest interval or multiple of an interval.
* This method modifies the given date object, converting it to the given
* timezone if specified.
*
* @param {Date} date the date object to round
* @param {Number} intervalUnit a constant, integer index specifying an
* interval, e.g. SimileAjax.DateTime.HOUR
* @param {Number} timeZone a timezone shift, given in hours
* @param {Number} multiple a multiple of the interval to round by
* @param {Number} firstDayOfWeek an integer specifying the first day of the
* week, 0 corresponds to Sunday, 1 to Monday, etc.
*/
SimileAjax.DateTime.roundDownToInterval = function(date, intervalUnit, timeZone, multiple, firstDayOfWeek) {
var timeShift = timeZone *
SimileAjax.DateTime.gregorianUnitLengths[SimileAjax.DateTime.HOUR];
var date2 = new Date(date.getTime() + timeShift);
var clearInDay = function(d) {
d.setUTCMilliseconds(0);
d.setUTCSeconds(0);
d.setUTCMinutes(0);
d.setUTCHours(0);
};
var clearInYear = function(d) {
clearInDay(d);
d.setUTCDate(1);
d.setUTCMonth(0);
};
switch(intervalUnit) {
case SimileAjax.DateTime.MILLISECOND:
var x = date2.getUTCMilliseconds();
date2.setUTCMilliseconds(x - (x % multiple));
break;
case SimileAjax.DateTime.SECOND:
date2.setUTCMilliseconds(0);
var x = date2.getUTCSeconds();
date2.setUTCSeconds(x - (x % multiple));
break;
case SimileAjax.DateTime.MINUTE:
date2.setUTCMilliseconds(0);
date2.setUTCSeconds(0);
var x = date2.getUTCMinutes();
date2.setTime(date2.getTime() -
(x % multiple) * SimileAjax.DateTime.gregorianUnitLengths[SimileAjax.DateTime.MINUTE]);
break;
case SimileAjax.DateTime.HOUR:
date2.setUTCMilliseconds(0);
date2.setUTCSeconds(0);
date2.setUTCMinutes(0);
var x = date2.getUTCHours();
date2.setUTCHours(x - (x % multiple));
break;
case SimileAjax.DateTime.DAY:
clearInDay(date2);
break;
case SimileAjax.DateTime.WEEK:
clearInDay(date2);
var d = (date2.getUTCDay() + 7 - firstDayOfWeek) % 7;
date2.setTime(date2.getTime() -
d * SimileAjax.DateTime.gregorianUnitLengths[SimileAjax.DateTime.DAY]);
break;
case SimileAjax.DateTime.MONTH:
clearInDay(date2);
date2.setUTCDate(1);
var x = date2.getUTCMonth();
date2.setUTCMonth(x - (x % multiple));
break;
case SimileAjax.DateTime.YEAR:
clearInYear(date2);
var x = date2.getUTCFullYear();
date2.setUTCFullYear(x - (x % multiple));
break;
case SimileAjax.DateTime.DECADE:
clearInYear(date2);
date2.setUTCFullYear(Math.floor(date2.getUTCFullYear() / 10) * 10);
break;
case SimileAjax.DateTime.CENTURY:
clearInYear(date2);
date2.setUTCFullYear(Math.floor(date2.getUTCFullYear() / 100) * 100);
break;
case SimileAjax.DateTime.MILLENNIUM:
clearInYear(date2);
date2.setUTCFullYear(Math.floor(date2.getUTCFullYear() / 1000) * 1000);
break;
}
date.setTime(date2.getTime() - timeShift);
};
/**
* Rounds date objects up to the nearest interval or multiple of an interval.
* This method modifies the given date object, converting it to the given
* timezone if specified.
*
* @param {Date} date the date object to round
* @param {Number} intervalUnit a constant, integer index specifying an
* interval, e.g. SimileAjax.DateTime.HOUR
* @param {Number} timeZone a timezone shift, given in hours
* @param {Number} multiple a multiple of the interval to round by
* @param {Number} firstDayOfWeek an integer specifying the first day of the
* week, 0 corresponds to Sunday, 1 to Monday, etc.
* @see SimileAjax.DateTime.roundDownToInterval
*/
SimileAjax.DateTime.roundUpToInterval = function(date, intervalUnit, timeZone, multiple, firstDayOfWeek) {
var originalTime = date.getTime();
SimileAjax.DateTime.roundDownToInterval(date, intervalUnit, timeZone, multiple, firstDayOfWeek);
if (date.getTime() < originalTime) {
date.setTime(date.getTime() +
SimileAjax.DateTime.gregorianUnitLengths[intervalUnit] * multiple);
}
};
/**
* Increments a date object by a specified interval, taking into
* consideration the timezone.
*
* @param {Date} date the date object to increment
* @param {Number} intervalUnit a constant, integer index specifying an
* interval, e.g. SimileAjax.DateTime.HOUR
* @param {Number} timeZone the timezone offset in hours
*/
SimileAjax.DateTime.incrementByInterval = function(date, intervalUnit, timeZone) {
timeZone = (typeof timeZone == 'undefined') ? 0 : timeZone;
var timeShift = timeZone *
SimileAjax.DateTime.gregorianUnitLengths[SimileAjax.DateTime.HOUR];
var date2 = new Date(date.getTime() + timeShift);
switch(intervalUnit) {
case SimileAjax.DateTime.MILLISECOND:
date2.setTime(date2.getTime() + 1)
break;
case SimileAjax.DateTime.SECOND:
date2.setTime(date2.getTime() + 1000);
break;
case SimileAjax.DateTime.MINUTE:
date2.setTime(date2.getTime() +
SimileAjax.DateTime.gregorianUnitLengths[SimileAjax.DateTime.MINUTE]);
break;
case SimileAjax.DateTime.HOUR:
date2.setTime(date2.getTime() +
SimileAjax.DateTime.gregorianUnitLengths[SimileAjax.DateTime.HOUR]);
break;
case SimileAjax.DateTime.DAY:
date2.setUTCDate(date2.getUTCDate() + 1);
break;
case SimileAjax.DateTime.WEEK:
date2.setUTCDate(date2.getUTCDate() + 7);
break;
case SimileAjax.DateTime.MONTH:
date2.setUTCMonth(date2.getUTCMonth() + 1);
break;
case SimileAjax.DateTime.YEAR:
date2.setUTCFullYear(date2.getUTCFullYear() + 1);
break;
case SimileAjax.DateTime.DECADE:
date2.setUTCFullYear(date2.getUTCFullYear() + 10);
break;
case SimileAjax.DateTime.CENTURY:
date2.setUTCFullYear(date2.getUTCFullYear() + 100);
break;
case SimileAjax.DateTime.MILLENNIUM:
date2.setUTCFullYear(date2.getUTCFullYear() + 1000);
break;
}
date.setTime(date2.getTime() - timeShift);
};
/**
* Returns a new date object with the given time offset removed.
*
* @param {Date} date the starting date
* @param {Number} timeZone a timezone specified in an hour offset to remove
* @return {Date} a new date object with the offset removed
*/
SimileAjax.DateTime.removeTimeZoneOffset = function(date, timeZone) {
return new Date(date.getTime() +
timeZone * SimileAjax.DateTime.gregorianUnitLengths[SimileAjax.DateTime.HOUR]);
};
/**
* Returns the timezone of the user's browser.
*
* @return {Number} the timezone in the user's locale in hours
*/
SimileAjax.DateTime.getTimezone = function() {
var d = new Date().getTimezoneOffset();
return d / -60;
};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?