123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 |
- /**
- * 此JS文件是格式化JS中日期时间的工具类,其中包含了传入日期对象Date,格式化成想要的格式,<br>
- * 或者传入字符串格式的时间个,次字符串日期对应的格式可以转换为相应的日期对象,<br>
- * 可以计算两个日期之间的差值
- *
- * y: 表示年
- * M:表示一年中的月份 1~12
- * d: 表示月份中的天数 1~31
- * H:表示一天中的小时数 00~23
- * m: 表示小时中的分钟数 00~59
- * s: 表示分钟中的秒数 00~59
- */
-
- var DateUtil = function(bDebug){
- this.isDebug = bDebug || false;
- this.curDate = allGetServerTime();
- };
-
- DateUtil.prototype = {
- //定义一些常用的日期格式的常量
- DEFAULT_DATE_FORMAT: 'yyyy-MM-dd',
- DEFAULT_MONTH_FORMAT: 'yyyy-MM',
- DEFAULT_YEAR_FORMAT: 'yyyy',
- DEFAULT_TIME_FORMAT: 'HH:mm:ss',
- DEFAULT_DATETIME_FORMAT: 'yyyy-MM-dd HH:mm:ss',
- DEFAULT_YEAR: 'YEAR',
- DEFAULT_MONTH: 'MONTH',
- DEFAULT_DATE: 'DATE',
- DEFAULT_HOUR: 'HOUR',
- DEFAULT_MINUTE: 'MINUTE',
- DEFAULT_SECOND: 'SECOND',
-
-
-
- /**
- * 根据给定的日期时间格式,格式化日期
- *
- * @params strFormat 格式化字符串, 如:"yyyy-MM-dd HH:mm:ss" 默认格式为:"yyyy-MM-dd"
- * @params count 过去的几天,如今天为0,昨天为1,最近7天为6,最近30天为29
- *
- * @return 返回根据给定格式的字符串表示的时间日期格式<br>
- * 如果传入不合法的格式,则返回日期的字符串格式{@see Date#toLocaleString()}
- *
- * count>1的时候显示日期区间
- */
- formatDate: function(count,strFormat){
- try{
- var tempFormat = strFormat == undefined? this.DEFAULT_DATE_FORMAT: strFormat;
- var oneDayMils = 1000 * 60 * 60 * 24;
- var chooseDate = new Date(Date.now() - oneDayMils*count);
- var nowDate = this.format(strFormat);
-
- var dates = this.getDateObject(chooseDate);
- if(/(y+)/.test(tempFormat)){
- var fullYear = chooseDate.getFullYear() + '';
- var year = RegExp.$1.length == 4? fullYear: fullYear.substr(4 - RegExp.$1.length);
- tempFormat = tempFormat.replace(RegExp.$1, year);
- }
- for(var i in dates){
- if(new RegExp('(' + i + ')').test(tempFormat)){
- var target = RegExp.$1.length == 1? dates[i]: ('0' + dates[i]).substr(('' + dates[i]).length - 1);
- tempFormat = tempFormat.replace(RegExp.$1, target);
- }
- }
-
- if(count>1){//超过一天,显示区间
- return (tempFormat === strFormat? chooseDate.toLocaleString(): tempFormat)+Parameters.DATE_PICKER_SEPERATOR+nowDate;
- }
- return tempFormat === strFormat? chooseDate.toLocaleString(): tempFormat;
- }catch(e){
- this.debug('格式化日期出现异常:' + e.message);
- }
- },
- /**
- * 显示几天后的日期
- * count 7天后 传7
- */
- afterDate : function(count,strFormat){
- try{
- var tempFormat = strFormat == undefined? this.DEFAULT_DATE_FORMAT: strFormat;
- var oneDayMils = 1000 * 60 * 60 * 24;
- var chooseDate = new Date(Date.now() + oneDayMils*(count-1));
- var nowDate = this.format(strFormat);
-
- var dates = this.getDateObject(chooseDate);
- if(/(y+)/.test(tempFormat)){
- var fullYear = chooseDate.getFullYear() + '';
- var year = RegExp.$1.length == 4? fullYear: fullYear.substr(4 - RegExp.$1.length);
- tempFormat = tempFormat.replace(RegExp.$1, year);
- }
- for(var i in dates){
- if(new RegExp('(' + i + ')').test(tempFormat)){
- var target = RegExp.$1.length == 1? dates[i]: ('0' + dates[i]).substr(('' + dates[i]).length - 1);
- tempFormat = tempFormat.replace(RegExp.$1, target);
- }
- }
- return tempFormat === strFormat? chooseDate.toLocaleString(): tempFormat;
- }catch(e){
- this.debug('格式化日期出现异常:' + e.message);
- }
-
- },
- /**
- * 根据传入的日期和天数得到几天是哪一天
- *
- * @params date 传入的日期
- * @params strFormat 格式化字符串, 如:"yyyy-MM-dd HH:mm:ss" 默认格式为:"yyyy-MM-dd"
- * @params count 传入日期的几天之后的日期
- *
- * @return
- */
- rangeDate : function(date,count,strFormat){
- try{
-
- date = new Date(date).getTime();
- var tempFormat = strFormat == undefined? this.DEFAULT_DATE_FORMAT: strFormat;
- var oneDayMils = 1000 * 60 * 60 * 24;
-
- var theDate = new Date(date + oneDayMils*(count-1));
- var dates = this.getDateObject(theDate);
-
- if(/(y+)/.test(tempFormat)){
- var fullYear = theDate.getFullYear() + '';
- var year = RegExp.$1.length == 4? fullYear: fullYear.substr(4 - RegExp.$1.length);
- tempFormat = tempFormat.replace(RegExp.$1, year);
- }
- for(var i in dates){
- if(new RegExp('(' + i + ')').test(tempFormat)){
- var target = RegExp.$1.length == 1? dates[i]: ('0' + dates[i]).substr(('' + dates[i]).length - 1);
- tempFormat = tempFormat.replace(RegExp.$1, target);
- }
- }
-
- return tempFormat === strFormat? chooseDate.toLocaleString(): tempFormat;
- }catch(e){
- this.debug('格式化日期出现异常:' + e.message);
- }
- },
-
- /**
- * 根据给定的日期时间格式,格式化当前日期
- * @params strFormat 格式化字符串, 如:"yyyy-MM-dd" 默认格式为:“yyyy-MM-dd HH:mm:ss”
- * @return 返回根据给定格式的字符串表示的时间日期格式<br>
- * 如果传入不合法的格式,则返回日期的字符串格式{@see Date#toLocaleString()}
- */
- formatCurrentDate: function(strFormat){
- try{
- var tempFormat = strFormat == undefined? this.DEFAULT_DATE_FORMAT: strFormat;
- var dates = this.getDateObject(this.curDate);
- if(/(y+)/.test(tempFormat)){
- var fullYear = this.curDate.getFullYear() + '';
- var year = RegExp.$1.length == 4? fullYear: fullYear.substr(4 - RegExp.$1.length);
- tempFormat = tempFormat.replace(RegExp.$1, year);
- }
- for(var i in dates){
- if(new RegExp('(' + i + ')').test(tempFormat)){
- var target = RegExp.$1.length == 1? dates[i]: ('0' + dates[i]).substr(('' + dates[i]).length - 1);
- tempFormat = tempFormat.replace(RegExp.$1, target);
- }
- }
- return tempFormat === strFormat? this.curDate.toLocaleString(): tempFormat;
- }catch(e){
- this.debug('格式化日期出现异常:' + e.message);
- }
- },
-
- /**
- * 根据给定的格式,把给定的时间进行格式化
- * @params date 要格式化的日期
- * @params strFormat 要得到的日期的格式的格式化字符串,如:'yyyy-MM-dd',默认:yyyy-MM-dd HH:mm:ss
- * @return 根据规定格式的时间格式
- *
- * @updateDate 2014-08-14
- */
- format: function(strFormat,date){
- try{
- if(date == undefined){
- this.curDate = allGetServerTime();
- }else if(!(date instanceof Date)){
- this.debug('你输入的date:' + date + '不是日期类型');
- return date;
- }else{
- this.curDate = date;
- }
- return this.formatCurrentDate(strFormat);
- }catch(e){
- this.debug('格式化日期出现异常:' + e.message);
- }
- },
-
- /**
- * 根据给定的格式对给定的字符串日期时间进行解析,
- * @params strDate 要解析的日期的字符串表示,此参数只能是字符串形式的日期,否则返回当期系统日期
- * @params strFormat 解析给定日期的顺序, 如果输入的strDate的格式为{Date.parse()}方法支持的格式,<br>
- * 则可以不传入,否则一定要传入与strDate对应的格式, 若不传入格式则返回当期系统日期。
- * @return 返回解析后的Date类型的时间<br>
- * 若不能解析则返回当前日期<br>
- * 若给定为时间格式 则返回的日期为 1970年1月1日的日期
- *
- * bug: 此方法目前只能实现类似'yyyy-MM-dd'格式的日期的转换,<br>
- * 而'yyyyMMdd'形式的日期,则不能实现
- */
-
- parseDate: function(strDate, strFormat){
- if(typeof strDate != 'string'){
- return allGetServerTime();
- }
- var longTime = Date.parse(strDate);
- if(isNaN(longTime)){
- if(strFormat == undefined){
- this.debug('请输入日期的格式');
- return allGetServerTime();
- }
- var tmpDate = allGetServerTime();
- var regFormat = /(\w{4})|(\w{2})|(\w{1})/g;
- var regDate = /(\d{4})|(\d{2})|(\d{1})/g;
- var formats = strFormat.match(regFormat);
- var dates = strDate.match(regDate);
- if( formats != undefined && dates != undefined && formats.length == dates.length){
- for(var i = 0; i < formats.length; i++){
- var format = formats[i];
- if(format === 'yyyy'){
- tmpDate.setFullYear(parseInt(dates[i], 10));
- }else if(format == 'yy'){
- var prefix = (tmpDate.getFullYear() + '').substring(0, 2);
- var year = (parseInt(dates[i], 10) + '').length == 4? parseInt(dates[i], 10): prefix + (parseInt(dates[i], 10) + '00').substring(0, 2);
- var tmpYear = parseInt(year, 10);
- tmpDate.setFullYear(tmpYear);
- }else if(format == 'MM' || format == 'M'){
- tmpDate.setMonth(parseInt(dates[i], 10) - 1);
- }else if(format == 'dd' || format == 'd'){
- tmpDate.setDate(parseInt(dates[i], 10));
- }else if(format == 'HH' || format == 'H'){
- tmpDate.setHours(parseInt(dates[i], 10));
- }else if(format == 'mm' || format == 'm'){
- tmpDate.setMinutes(parseInt(dates[i], 10));
- }else if(format == 'ss' || format == 's'){
- tmpDate.setSeconds(parseInt(dates[i], 10));
- }
- }
- return tmpDate;
- }
- return tmpDate;
- }else{
- return new Date(longTime);
- }
- },
-
-
- /**
- * 根据给定的时间间隔类型及间隔值,以给定的格式对给定的时间进行计算并格式化返回
- * @params date 要操作的日期时间可以为时间的字符串或者{@see Date}类似的时间对象,
- * @params interval 时间间隔类型如:"YEAR"、"MONTH"、 "DATE", 不区分大小写
- * @params amount 时间间隔值,可以正数和负数, 负数为在date的日期减去相应的数值,正数为在date的日期上加上相应的数值
- * @params strFormat 当输入端的date的格式为字符串是,此项必须输入。若date参数为{@see Date}类型是此项会作为最终输出的格式。
- * @params targetFormat 最终输出的日期时间的格式,若没有输入则使用strFormat或者默认格式'yyyy-MM-dd HH:mm:ss'
- * @return 返回计算并格式化后的时间的字符串
- */
- changeDate: function(date, interval, amount, strFormat, targetFormat){
- var tmpdate = allGetServerTime();
- if(date == undefined){
- this.debug('输入的时间不能为空!');
- return allGetServerTime();
- }else if(typeof date == 'string'){
- tmpdate = this.parseDate(date, strFormat);
- }else if(date instanceof Date){
- tmpdate = date;
- }
- var field = (typeof interval == 'string')? interval.toUpperCase(): 'DATE';
-
- try{
- amount = parseInt(amount + '', 10);
- if(isNaN(amount)){
- amount = 0;
- }
- }catch(e){
- this.debug('你输入的[amount=' + amount + ']不能转换为整数');
- amount = 0;
- }
- switch(field){
- case this.DEFAULT_YEAR:
- tmpdate.setFullYear(tmpdate.getFullYear() + amount);
- break;
- case this.DEFAULT_MONTH:
- tmpdate.setMonth(tmpdate.getMonth() + amount);
- break;
- case this.DEFAULT_DATE:
- tmpdate.setDate(tmpdate.getDate() + amount);
- break;
- case this.DEFAULT_HOUR:
- tmpdate.setHours(tmpdate.getHours() + amount);
- break;
- case this.DEFAULT_MINUTE:
- tmpdate.setMinutes(tmpdate.getMinutes() + amount);
- break;
- case this.DEFAULT_SECOND:
- tmpdate.setSeconds(tmpdate.getSeconds() + amount);
- break;
- default:
- this.debug('你输入的[interval:' + field + '] 不符合条件!');
- }
-
- this.curDate = tmpdate;
- return this.formatCurrentDate(targetFormat == undefined? strFormat: targetFormat);
- },
-
- /**
- * 比较两个日期的差距
- * @param date1 Date类型的时间
- * @param date2 Dete 类型的时间
- * @param isFormat boolean 是否对得出的时间进行格式化,<br>
- * false:返回毫秒数,true:返回格式化后的数据
- * @return 返回两个日期之间的毫秒数 或者是格式化后的结果
- */
- compareTo: function(date1, date2, isFormat){
- try{
- var len = arguments.length;
- var tmpdate1 = allGetServerTime();
- var tmpdate2 = allGetServerTime();
- if(len == 1){
- tmpdate1 = date1;
- }else if(len >= 2){
- tmpdate1 = date1;
- tmpdate2 = date2;
- }
- if(!(tmpdate1 instanceof Date) || !(tmpdate2 instanceof Date)){
- return 0;
- }else{
- var time1 = tmpdate1.getTime();
- var time2 = tmpdate2.getTime();
- var time = Math.max(time1, time2) - Math.min(time1, time2);
- if(!isNaN(time) && time > 0){
- if(isFormat){
- var date = new Date(time);
- var result = {};
- result['year'] = (date.getFullYear() - 1970) > 0? (date.getFullYear() - 1970): '0';
- result['month'] = (date.getMonth() - 1) > 0? (date.getMonth() - 1): '0';
- result['day'] = (date.getDate() - 1) > 0? (date.getDate() - 1): '0';
- result['hour'] = (date.getHours() - 8) > 0? (date.getHours() - 1): '0';
- result['minute'] = date.getMinutes() > 0? date.getMinutes(): '0';
- result['second'] = date.getSeconds() > 0? date.getSeconds(): '0';
- return result;
- }else {
- return time;
- }
- }else{
- return 0;
- }
- }
- }catch(e){
- this.debug('比较时间出现异常' + e.message);
- }
- },
-
- /**
- * 根据给定的日期得到日期的月,日,时,分和秒的对象
- * @params date 给定的日期 date为非Date类型, 则获取当前日期
- * @return 有给定日期的月、日、时、分和秒组成的对象
- */
- getDateObject: function(date){
- if(!(date instanceof Date)){
- date = allGetServerTime();
- }
- return {
- 'M+' : date.getMonth() + 1,
- 'd+' : date.getDate(),
- 'H+' : date.getHours(),
- 'm+' : date.getMinutes(),
- 's+' : date.getSeconds()
- };
- },
-
- /**
- *在控制台输出日志
- *@params message 要输出的日志信息
- */
- debug: function(message){
- try{
- if(!this.isDebug){
- return;
- }
- if(!window.console){
- window.console = {};
- window.console.log = function(){
- return;
- }
- }
- window.console.log(message + ' ');
- }catch(e){
- }
- }
- };
|