3948463bc02d62cd831cd16b9988f39da767f2aa.svn-base 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. /**
  2. * 此JS文件是格式化JS中日期时间的工具类,其中包含了传入日期对象Date,格式化成想要的格式,<br>
  3. * 或者传入字符串格式的时间个,次字符串日期对应的格式可以转换为相应的日期对象,<br>
  4. * 可以计算两个日期之间的差值
  5. *
  6. * y: 表示年
  7. * M:表示一年中的月份 1~12
  8. * d: 表示月份中的天数 1~31
  9. * H:表示一天中的小时数 00~23
  10. * m: 表示小时中的分钟数 00~59
  11. * s: 表示分钟中的秒数 00~59
  12. */
  13. var DateUtil = function(bDebug){
  14. this.isDebug = bDebug || false;
  15. this.curDate = allGetServerTime();
  16. };
  17. DateUtil.prototype = {
  18. //定义一些常用的日期格式的常量
  19. DEFAULT_DATE_FORMAT: 'yyyy-MM-dd',
  20. DEFAULT_MONTH_FORMAT: 'yyyy-MM',
  21. DEFAULT_YEAR_FORMAT: 'yyyy',
  22. DEFAULT_TIME_FORMAT: 'HH:mm:ss',
  23. DEFAULT_DATETIME_FORMAT: 'yyyy-MM-dd HH:mm:ss',
  24. DEFAULT_YEAR: 'YEAR',
  25. DEFAULT_MONTH: 'MONTH',
  26. DEFAULT_DATE: 'DATE',
  27. DEFAULT_HOUR: 'HOUR',
  28. DEFAULT_MINUTE: 'MINUTE',
  29. DEFAULT_SECOND: 'SECOND',
  30. /**
  31. * 根据给定的日期时间格式,格式化日期
  32. *
  33. * @params strFormat 格式化字符串, 如:"yyyy-MM-dd HH:mm:ss" 默认格式为:"yyyy-MM-dd"
  34. * @params count 过去的几天,如今天为0,昨天为1,最近7天为6,最近30天为29
  35. *
  36. * @return 返回根据给定格式的字符串表示的时间日期格式<br>
  37. * 如果传入不合法的格式,则返回日期的字符串格式{@see Date#toLocaleString()}
  38. *
  39. * count>1的时候显示日期区间
  40. */
  41. formatDate: function(count,strFormat){
  42. try{
  43. var tempFormat = strFormat == undefined? this.DEFAULT_DATE_FORMAT: strFormat;
  44. var oneDayMils = 1000 * 60 * 60 * 24;
  45. var chooseDate = new Date(Date.now() - oneDayMils*count);
  46. var nowDate = this.format(strFormat);
  47. var dates = this.getDateObject(chooseDate);
  48. if(/(y+)/.test(tempFormat)){
  49. var fullYear = chooseDate.getFullYear() + '';
  50. var year = RegExp.$1.length == 4? fullYear: fullYear.substr(4 - RegExp.$1.length);
  51. tempFormat = tempFormat.replace(RegExp.$1, year);
  52. }
  53. for(var i in dates){
  54. if(new RegExp('(' + i + ')').test(tempFormat)){
  55. var target = RegExp.$1.length == 1? dates[i]: ('0' + dates[i]).substr(('' + dates[i]).length - 1);
  56. tempFormat = tempFormat.replace(RegExp.$1, target);
  57. }
  58. }
  59. if(count>1){//超过一天,显示区间
  60. return (tempFormat === strFormat? chooseDate.toLocaleString(): tempFormat)+Parameters.DATE_PICKER_SEPERATOR+nowDate;
  61. }
  62. return tempFormat === strFormat? chooseDate.toLocaleString(): tempFormat;
  63. }catch(e){
  64. this.debug('格式化日期出现异常:' + e.message);
  65. }
  66. },
  67. /**
  68. * 显示几天后的日期
  69. * count 7天后 传7
  70. */
  71. afterDate : function(count,strFormat){
  72. try{
  73. var tempFormat = strFormat == undefined? this.DEFAULT_DATE_FORMAT: strFormat;
  74. var oneDayMils = 1000 * 60 * 60 * 24;
  75. var chooseDate = new Date(Date.now() + oneDayMils*(count-1));
  76. var nowDate = this.format(strFormat);
  77. var dates = this.getDateObject(chooseDate);
  78. if(/(y+)/.test(tempFormat)){
  79. var fullYear = chooseDate.getFullYear() + '';
  80. var year = RegExp.$1.length == 4? fullYear: fullYear.substr(4 - RegExp.$1.length);
  81. tempFormat = tempFormat.replace(RegExp.$1, year);
  82. }
  83. for(var i in dates){
  84. if(new RegExp('(' + i + ')').test(tempFormat)){
  85. var target = RegExp.$1.length == 1? dates[i]: ('0' + dates[i]).substr(('' + dates[i]).length - 1);
  86. tempFormat = tempFormat.replace(RegExp.$1, target);
  87. }
  88. }
  89. return tempFormat === strFormat? chooseDate.toLocaleString(): tempFormat;
  90. }catch(e){
  91. this.debug('格式化日期出现异常:' + e.message);
  92. }
  93. },
  94. /**
  95. * 根据传入的日期和天数得到几天是哪一天
  96. *
  97. * @params date 传入的日期
  98. * @params strFormat 格式化字符串, 如:"yyyy-MM-dd HH:mm:ss" 默认格式为:"yyyy-MM-dd"
  99. * @params count 传入日期的几天之后的日期
  100. *
  101. * @return
  102. */
  103. rangeDate : function(date,count,strFormat){
  104. try{
  105. date = new Date(date).getTime();
  106. var tempFormat = strFormat == undefined? this.DEFAULT_DATE_FORMAT: strFormat;
  107. var oneDayMils = 1000 * 60 * 60 * 24;
  108. var theDate = new Date(date + oneDayMils*(count-1));
  109. var dates = this.getDateObject(theDate);
  110. if(/(y+)/.test(tempFormat)){
  111. var fullYear = theDate.getFullYear() + '';
  112. var year = RegExp.$1.length == 4? fullYear: fullYear.substr(4 - RegExp.$1.length);
  113. tempFormat = tempFormat.replace(RegExp.$1, year);
  114. }
  115. for(var i in dates){
  116. if(new RegExp('(' + i + ')').test(tempFormat)){
  117. var target = RegExp.$1.length == 1? dates[i]: ('0' + dates[i]).substr(('' + dates[i]).length - 1);
  118. tempFormat = tempFormat.replace(RegExp.$1, target);
  119. }
  120. }
  121. return tempFormat === strFormat? chooseDate.toLocaleString(): tempFormat;
  122. }catch(e){
  123. this.debug('格式化日期出现异常:' + e.message);
  124. }
  125. },
  126. /**
  127. * 根据给定的日期时间格式,格式化当前日期
  128. * @params strFormat 格式化字符串, 如:"yyyy-MM-dd" 默认格式为:“yyyy-MM-dd HH:mm:ss”
  129. * @return 返回根据给定格式的字符串表示的时间日期格式<br>
  130. * 如果传入不合法的格式,则返回日期的字符串格式{@see Date#toLocaleString()}
  131. */
  132. formatCurrentDate: function(strFormat){
  133. try{
  134. var tempFormat = strFormat == undefined? this.DEFAULT_DATE_FORMAT: strFormat;
  135. var dates = this.getDateObject(this.curDate);
  136. if(/(y+)/.test(tempFormat)){
  137. var fullYear = this.curDate.getFullYear() + '';
  138. var year = RegExp.$1.length == 4? fullYear: fullYear.substr(4 - RegExp.$1.length);
  139. tempFormat = tempFormat.replace(RegExp.$1, year);
  140. }
  141. for(var i in dates){
  142. if(new RegExp('(' + i + ')').test(tempFormat)){
  143. var target = RegExp.$1.length == 1? dates[i]: ('0' + dates[i]).substr(('' + dates[i]).length - 1);
  144. tempFormat = tempFormat.replace(RegExp.$1, target);
  145. }
  146. }
  147. return tempFormat === strFormat? this.curDate.toLocaleString(): tempFormat;
  148. }catch(e){
  149. this.debug('格式化日期出现异常:' + e.message);
  150. }
  151. },
  152. /**
  153. * 根据给定的格式,把给定的时间进行格式化
  154. * @params date 要格式化的日期
  155. * @params strFormat 要得到的日期的格式的格式化字符串,如:'yyyy-MM-dd',默认:yyyy-MM-dd HH:mm:ss
  156. * @return 根据规定格式的时间格式
  157. *
  158. * @updateDate 2014-08-14
  159. */
  160. format: function(strFormat,date){
  161. try{
  162. if(date == undefined){
  163. this.curDate = allGetServerTime();
  164. }else if(!(date instanceof Date)){
  165. this.debug('你输入的date:' + date + '不是日期类型');
  166. return date;
  167. }else{
  168. this.curDate = date;
  169. }
  170. return this.formatCurrentDate(strFormat);
  171. }catch(e){
  172. this.debug('格式化日期出现异常:' + e.message);
  173. }
  174. },
  175. /**
  176. * 根据给定的格式对给定的字符串日期时间进行解析,
  177. * @params strDate 要解析的日期的字符串表示,此参数只能是字符串形式的日期,否则返回当期系统日期
  178. * @params strFormat 解析给定日期的顺序, 如果输入的strDate的格式为{Date.parse()}方法支持的格式,<br>
  179. * 则可以不传入,否则一定要传入与strDate对应的格式, 若不传入格式则返回当期系统日期。
  180. * @return 返回解析后的Date类型的时间<br>
  181. * 若不能解析则返回当前日期<br>
  182. * 若给定为时间格式 则返回的日期为 1970年1月1日的日期
  183. *
  184. * bug: 此方法目前只能实现类似'yyyy-MM-dd'格式的日期的转换,<br>
  185. * 而'yyyyMMdd'形式的日期,则不能实现
  186. */
  187. parseDate: function(strDate, strFormat){
  188. if(typeof strDate != 'string'){
  189. return allGetServerTime();
  190. }
  191. var longTime = Date.parse(strDate);
  192. if(isNaN(longTime)){
  193. if(strFormat == undefined){
  194. this.debug('请输入日期的格式');
  195. return allGetServerTime();
  196. }
  197. var tmpDate = allGetServerTime();
  198. var regFormat = /(\w{4})|(\w{2})|(\w{1})/g;
  199. var regDate = /(\d{4})|(\d{2})|(\d{1})/g;
  200. var formats = strFormat.match(regFormat);
  201. var dates = strDate.match(regDate);
  202. if( formats != undefined && dates != undefined && formats.length == dates.length){
  203. for(var i = 0; i < formats.length; i++){
  204. var format = formats[i];
  205. if(format === 'yyyy'){
  206. tmpDate.setFullYear(parseInt(dates[i], 10));
  207. }else if(format == 'yy'){
  208. var prefix = (tmpDate.getFullYear() + '').substring(0, 2);
  209. var year = (parseInt(dates[i], 10) + '').length == 4? parseInt(dates[i], 10): prefix + (parseInt(dates[i], 10) + '00').substring(0, 2);
  210. var tmpYear = parseInt(year, 10);
  211. tmpDate.setFullYear(tmpYear);
  212. }else if(format == 'MM' || format == 'M'){
  213. tmpDate.setMonth(parseInt(dates[i], 10) - 1);
  214. }else if(format == 'dd' || format == 'd'){
  215. tmpDate.setDate(parseInt(dates[i], 10));
  216. }else if(format == 'HH' || format == 'H'){
  217. tmpDate.setHours(parseInt(dates[i], 10));
  218. }else if(format == 'mm' || format == 'm'){
  219. tmpDate.setMinutes(parseInt(dates[i], 10));
  220. }else if(format == 'ss' || format == 's'){
  221. tmpDate.setSeconds(parseInt(dates[i], 10));
  222. }
  223. }
  224. return tmpDate;
  225. }
  226. return tmpDate;
  227. }else{
  228. return new Date(longTime);
  229. }
  230. },
  231. /**
  232. * 根据给定的时间间隔类型及间隔值,以给定的格式对给定的时间进行计算并格式化返回
  233. * @params date 要操作的日期时间可以为时间的字符串或者{@see Date}类似的时间对象,
  234. * @params interval 时间间隔类型如:"YEAR"、"MONTH"、 "DATE", 不区分大小写
  235. * @params amount 时间间隔值,可以正数和负数, 负数为在date的日期减去相应的数值,正数为在date的日期上加上相应的数值
  236. * @params strFormat 当输入端的date的格式为字符串是,此项必须输入。若date参数为{@see Date}类型是此项会作为最终输出的格式。
  237. * @params targetFormat 最终输出的日期时间的格式,若没有输入则使用strFormat或者默认格式'yyyy-MM-dd HH:mm:ss'
  238. * @return 返回计算并格式化后的时间的字符串
  239. */
  240. changeDate: function(date, interval, amount, strFormat, targetFormat){
  241. var tmpdate = allGetServerTime();
  242. if(date == undefined){
  243. this.debug('输入的时间不能为空!');
  244. return allGetServerTime();
  245. }else if(typeof date == 'string'){
  246. tmpdate = this.parseDate(date, strFormat);
  247. }else if(date instanceof Date){
  248. tmpdate = date;
  249. }
  250. var field = (typeof interval == 'string')? interval.toUpperCase(): 'DATE';
  251. try{
  252. amount = parseInt(amount + '', 10);
  253. if(isNaN(amount)){
  254. amount = 0;
  255. }
  256. }catch(e){
  257. this.debug('你输入的[amount=' + amount + ']不能转换为整数');
  258. amount = 0;
  259. }
  260. switch(field){
  261. case this.DEFAULT_YEAR:
  262. tmpdate.setFullYear(tmpdate.getFullYear() + amount);
  263. break;
  264. case this.DEFAULT_MONTH:
  265. tmpdate.setMonth(tmpdate.getMonth() + amount);
  266. break;
  267. case this.DEFAULT_DATE:
  268. tmpdate.setDate(tmpdate.getDate() + amount);
  269. break;
  270. case this.DEFAULT_HOUR:
  271. tmpdate.setHours(tmpdate.getHours() + amount);
  272. break;
  273. case this.DEFAULT_MINUTE:
  274. tmpdate.setMinutes(tmpdate.getMinutes() + amount);
  275. break;
  276. case this.DEFAULT_SECOND:
  277. tmpdate.setSeconds(tmpdate.getSeconds() + amount);
  278. break;
  279. default:
  280. this.debug('你输入的[interval:' + field + '] 不符合条件!');
  281. }
  282. this.curDate = tmpdate;
  283. return this.formatCurrentDate(targetFormat == undefined? strFormat: targetFormat);
  284. },
  285. /**
  286. * 比较两个日期的差距
  287. * @param date1 Date类型的时间
  288. * @param date2 Dete 类型的时间
  289. * @param isFormat boolean 是否对得出的时间进行格式化,<br>
  290. * false:返回毫秒数,true:返回格式化后的数据
  291. * @return 返回两个日期之间的毫秒数 或者是格式化后的结果
  292. */
  293. compareTo: function(date1, date2, isFormat){
  294. try{
  295. var len = arguments.length;
  296. var tmpdate1 = allGetServerTime();
  297. var tmpdate2 = allGetServerTime();
  298. if(len == 1){
  299. tmpdate1 = date1;
  300. }else if(len >= 2){
  301. tmpdate1 = date1;
  302. tmpdate2 = date2;
  303. }
  304. if(!(tmpdate1 instanceof Date) || !(tmpdate2 instanceof Date)){
  305. return 0;
  306. }else{
  307. var time1 = tmpdate1.getTime();
  308. var time2 = tmpdate2.getTime();
  309. var time = Math.max(time1, time2) - Math.min(time1, time2);
  310. if(!isNaN(time) && time > 0){
  311. if(isFormat){
  312. var date = new Date(time);
  313. var result = {};
  314. result['year'] = (date.getFullYear() - 1970) > 0? (date.getFullYear() - 1970): '0';
  315. result['month'] = (date.getMonth() - 1) > 0? (date.getMonth() - 1): '0';
  316. result['day'] = (date.getDate() - 1) > 0? (date.getDate() - 1): '0';
  317. result['hour'] = (date.getHours() - 8) > 0? (date.getHours() - 1): '0';
  318. result['minute'] = date.getMinutes() > 0? date.getMinutes(): '0';
  319. result['second'] = date.getSeconds() > 0? date.getSeconds(): '0';
  320. return result;
  321. }else {
  322. return time;
  323. }
  324. }else{
  325. return 0;
  326. }
  327. }
  328. }catch(e){
  329. this.debug('比较时间出现异常' + e.message);
  330. }
  331. },
  332. /**
  333. * 根据给定的日期得到日期的月,日,时,分和秒的对象
  334. * @params date 给定的日期 date为非Date类型, 则获取当前日期
  335. * @return 有给定日期的月、日、时、分和秒组成的对象
  336. */
  337. getDateObject: function(date){
  338. if(!(date instanceof Date)){
  339. date = allGetServerTime();
  340. }
  341. return {
  342. 'M+' : date.getMonth() + 1,
  343. 'd+' : date.getDate(),
  344. 'H+' : date.getHours(),
  345. 'm+' : date.getMinutes(),
  346. 's+' : date.getSeconds()
  347. };
  348. },
  349. /**
  350. *在控制台输出日志
  351. *@params message 要输出的日志信息
  352. */
  353. debug: function(message){
  354. try{
  355. if(!this.isDebug){
  356. return;
  357. }
  358. if(!window.console){
  359. window.console = {};
  360. window.console.log = function(){
  361. return;
  362. }
  363. }
  364. window.console.log(message + ' ');
  365. }catch(e){
  366. }
  367. }
  368. };