javascript中对Date类型的常用操作小结

转载 2016年05月31日 13:50:31

javascript中对Date类型的常用操作小结

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
/**
3. * 日期时间脚本库方法列表:
4. * (1)Date.isValiDate:日期合法性验证
5. * (2)Date.isValiTime:时间合法性验证
6. * (3)Date.isValiDateTime:日期和时间合法性验证
7. * (4)Date.prototype.isLeapYear:判断是否闰年
8. * (5)Date.prototype.format:日期格式化
9. * (6)Date.stringToDate:字符串转成日期类型
10. * (7)Date.daysBetween:计算两个日期的天数差
11. * (8)Date.prototype.dateAdd:日期计算,支持正负数
12. * (9)Date.prototype.dateDiff:比较日期差:比较两个时期相同的字段,返回相差值
13. * (10)Date.prototype.toArray:把日期分割成数组:按数组序号分别为:年月日时分秒
14. * (11)Date.prototype.datePart:取得日期数据信息
15. */
16.
17.
18./**
19. * 日期合法性验证:判断dataStr是否符合formatStr指定的日期格式
20. * 示例:
21. * (1)alert(Date.isValiDate('2008-02-29','yyyy-MM-dd'));//true
22. * (2)alert(Date.isValiDate('aaaa-58-29','yyyy-MM-dd'));//false
23. * dateStr:必选,日期字符串
24. * formatStr:可选,格式字符串,可选格式有:(1)yyyy-MM-dd(默认格式)或YYYY-MM-DD (2)yyyy/MM/dd或YYYY/MM/DD (3)MM-dd-yyyy或MM-DD-YYYY (4)MM/dd/yyyy或MM/DD/YYYY
25. */
26.Date.isValiDate = function(dateStr, formatStr)
27.{
28.  if(!dateStr){
29.    return false;
30.  }
31.  if(!formatStr){
32.    formatStr = "yyyy-MM-dd";//默认格式:yyyy-MM-dd 
33.  }
34.  if(dateStr.length!=formatStr.length){
35.    return false;
36.  }else{
37.    if(formatStr=="yyyy-MM-dd"||formatStr=="YYYY-MM-DD"){
38.      var r1=/^(((((([02468][048])|([13579][26]))(00))|(\d{2}(([02468][48])|([13579][26]))))\-((((0[13578])|(1[02]))\-(([0-2][0-9])|(3[01])))|(((0[469])|(11))\-(([0-2][0-9])|(30)))|(02\-([0-2][0-9]))))|(\d{2}(([02468][1235679])|([13579][01345789]))\-((((0[13578])|(1[02]))\-(([0-2][0-9])|(3[01])))|(((0[469])|(11))\-(([0-2][0-9])|(30)))|(02\-(([0-1][0-9])|(2[0-8]))))))$/;
39.      return r1.test(dateStr);
40.    }else if(formatStr=="yyyy/MM/dd"||formatStr=="YYYY/MM/DD"){
41.      var r2=/^(((((([02468][048])|([13579][26]))(00))|(\d{2}(([02468][48])|([13579][26]))))\/((((0[13578])|(1[02]))\/(([0-2][0-9])|(3[01])))|(((0[469])|(11))\/(([0-2][0-9])|(30)))|(02\/([0-2][0-9]))))|(\d{2}(([02468][1235679])|([13579][01345789]))\/((((0[13578])|(1[02]))\/(([0-2][0-9])|(3[01])))|(((0[469])|(11))\/(([0-2][0-9])|(30)))|(02\/(([0-1][0-9])|(2[0-8]))))))$/;
42.      return r2.test(dateStr);
43.    }else if(formatStr=="MM-dd-yyyy"||formatStr=="MM-DD-YYYY"){
44.      var r3=/^((((((0[13578])|(1[02]))\-(([0-2][0-9])|(3[01])))|(((0[469])|(11))\-(([0-2][0-9])|(30)))|(02\-([0-2][0-9])))\-(((([02468][048])|([13579][26]))(00))|(\d{2}(([02468][48])|([13579][26])))))|(((((0[13578])|(1[02]))\-(([0-2][0-9])|(3[01])))|(((0[469])|(11))\-(([0-2][0-9])|(30)))|(02\-(([0-1][0-9])|(2[0-8])))))\-\d{2}(([02468][1235679])|([13579][01345789])))$/;
45.      return r3.test(dateStr);
46.    }else if(formatStr=="MM/dd/yyyy"||formatStr=="MM/DD/YYYY"){
47.      var r4=/^((((((0[13578])|(1[02]))\/(([0-2][0-9])|(3[01])))|(((0[469])|(11))\/(([0-2][0-9])|(30)))|(02\/([0-2][0-9])))\/(((([02468][048])|([13579][26]))(00))|(\d{2}(([02468][48])|([13579][26])))))|(((((0[13578])|(1[02]))\/(([0-2][0-9])|(3[01])))|(((0[469])|(11))\/(([0-2][0-9])|(30)))|(02\/(([0-1][0-9])|(2[0-8])))))\/\d{2}(([02468][1235679])|([13579][01345789])))$/;
48.      return r4.test(dateStr);
49.    }else{
50.      alert("日期格式不正确!");
51.      return false;
52.    }
53.  }
54.  return false;
55.}
56.
57.
58./**
59. * 时间合法性验证:判断timeStr是否符合formatStr指定的时间格式
60. * 示例:
61. * (1)alert(Date.isValiTime('23:59:59','hh:mm:ss'));//true
62. * (2)alert(Date.isValiTime('24-68-89','hh:mm:ss'));//false
63. * timeStr:必选,日期字符串
64. * formatStr:可选,格式字符串,可选格式有:(1)hh:mm:ss(默认格式) (2)hh-mm-ss (3)hh/mm/ss
65. */
66.Date.isValiTime = function(timeStr, formatStr)
67.{
68.  if(!timeStr){
69.    return false;
70.  }
71.  if(!formatStr){
72.    formatStr = "hh:mm:ss";//默认格式:hh:mm:ss 
73.  }
74.  if(timeStr.length!=formatStr.length){
75.    return false;
76.  }else{
77.    if(formatStr=="hh:mm:ss"){
78.      var r1=/^(([0-1][0-9])|(2[0-3]))\:([0-5][0-9])\:([0-5][0-9])$/;
79.      return r1.test(timeStr);
80.    }else if(formatStr=="hh-mm-ss"){
81.      var r2=/^(([0-1][0-9])|(2[0-3]))\-([0-5][0-9])\-([0-5][0-9])$/;
82.      return r2.test(timeStr);
83.    }else if(formatStr=="hh/mm/ss"){
84.      var r3=/^(([0-1][0-9])|(2[0-3]))\/([0-5][0-9])\/([0-5][0-9])$/;
85.      return r3.test(timeStr);
86.    }else{
87.      alert("时间格式不正确!");
88.      return false;
89.    }
90.  }
91.  return false;
92.}
93.
94.
95./**
96. * 日期和时间合法性验证
97. * 格式:yyyy-MM-dd hh:mm:ss
98. */
99.Date.isValiDateTime = function(dateTimeStr)
100.{
101.  var dateTimeReg=/^(((((([02468][048])|([13579][26]))(00))|(\d{2}(([02468][48])|([13579][26]))))\-((((0[13578])|(1[02]))\-(([0-2][0-9])|(3[01])))|(((0[469])|(11))\-(([0-2][0-9])|(30)))|(02\-([0-2][0-9]))))|(\d{2}(([02468][1235679])|([13579][01345789]))\-((((0[13578])|(1[02]))\-(([0-2][0-9])|(3[01])))|(((0[469])|(11))\-(([0-2][0-9])|(30)))|(02\-(([0-1][0-9])|(2[0-8]))))))(\s{1}(([0-1][0-9])|(2[0-3]))\:([0-5][0-9])\:([0-5][0-9]))?$/
102.  return dateTimeReg.test(dateTimeStr);
103.}
104.
105.
106./**
107. * 判断闰年 :一般规律为:四年一闰,百年不闰,四百年再闰。
108. */
109.Date.prototype.isLeapYear = function()
110.{
111.  return (this.getYear()%4==0&&((this.getYear()%100!=0)||(this.getYear()%400==0)));
112.}
113.
114.
115./**
116. * 日期格式化:
117. * formatStr:可选,格式字符串,默认格式:yyyy-MM-dd hh:mm:ss
118. * 约定如下格式:
119. * (1)YYYY/yyyy/YY/yy 表示年份
120. * (2)MM/M 月份
121. * (3)W/w 星期
122. * (4)dd/DD/d/D 日期
123. * (5)hh/HH/h/H 时间
124. * (6)mm/m 分钟
125. * (7)ss/SS/s/S 秒
126. * (8)iii 毫秒
127. */
128.Date.prototype.format = function(formatStr)
129.{
130.  var str = formatStr;
131.  if(!formatStr){
132.    str = "yyyy-MM-dd hh:mm:ss";//默认格式 
133.  }
134.  var Week = ['日','一','二','三','四','五','六'];
135.  
136.  str=str.replace(/yyyy|YYYY/,this.getFullYear());
137.  str=str.replace(/yy|YY/,(this.getYear() % 100)>9?(this.getYear() % 100).toString():'0' + (this.getYear() % 100));
138.  
139.  str=str.replace(/MM/,this.getMonth()>=9?(parseInt(this.getMonth())+1).toString():'0' + (parseInt(this.getMonth())+1));
140.  str=str.replace(/M/g,(parseInt(this.getMonth())+1));
141.  
142.  str=str.replace(/w|W/g,Week[this.getDay()]);
143.  
144.  str=str.replace(/dd|DD/,this.getDate()>9?this.getDate().toString():'0' + this.getDate());
145.  str=str.replace(/d|D/g,this.getDate());
146.  
147.  str=str.replace(/hh|HH/,this.getHours()>9?this.getHours().toString():'0' + this.getHours());
148.  str=str.replace(/h|H/g,this.getHours());
149.  str=str.replace(/mm/,this.getMinutes()>9?this.getMinutes().toString():'0' + this.getMinutes());
150.  str=str.replace(/m/g,this.getMinutes());
151.  
152.  str=str.replace(/ss|SS/,this.getSeconds()>9?this.getSeconds().toString():'0' + this.getSeconds());
153.  str=str.replace(/s|S/g,this.getSeconds());
154.  
155.  str=str.replace(/iii/g,this.getMilliseconds()<10?'00'+this.getMilliseconds():(this.getMilliseconds()<100?'0'+this.getMilliseconds():this.getMilliseconds()));
156.  
157.  return str;
158.}
159.
160.
161./**
162. * 字符串转成日期类型:
163. * dateStr:必选,日期字符串,如果无法解析成日期类型,返回null
164. * 格式:
165. * (1)yyyy/MM/dd:IE和FF通用
166. * (2)MM/dd/yyyy:IE和FF通用
167. * (3)MM-dd-yyyy:仅IE
168. * (4)yyyy-MM-dd:非IE,且时钟被解析在8点整
169. */
170.Date.stringToDate = function(dateStr)
171.{
172.  if(!dateStr){
173.    alert("字符串无法解析为日期");
174.    return null;
175.  }else{
176.    if(Date.isValiDate(dateStr,"yyyy/MM/dd")||Date.isValiDate(dateStr,"MM/dd/yyyy")){
177.      return new Date(Date.parse(dateStr));
178.    }else{
179.      if((!-[1,])){//IE 
180.        if(Date.isValiDate(dateStr,"MM-dd-yyyy")){
181.          return new Date(Date.parse(dateStr));
182.        }else{
183.          alert("字符串无法解析为日期");
184.          return null;
185.        }
186.      }else{//非IE 
187.        if(Date.isValiDate(dateStr,"yyyy-MM-dd")){
188.          return new Date(Date.parse(dateStr));
189.        }else{
190.          alert("字符串无法解析为日期");
191.          return null;
192.        }
193.      }
194.    }
195.  }
196.  return null;
197.}
198.
199.
200./**
201. * 计算两个日期的天数差:
202. * dateOne:必选,必须是Data类型的实例
203. * dateTwo:必选,必须是Data类型的实例
204. */
205.Date.daysBetween = function(dateOne,dateTwo)
206.{
207.  if((dateOne instanceof Date)==false||(dateTwo instanceof Date)==false){
208.    return 0;
209.  }else{
210.    return Math.abs(Math.floor((dateOne.getTime()-dateTwo.getTime())/1000/60/60/24));
211.  }
212.}
213.
214.
215./**
216. * 日期计算:支持负数,即可加可减,返回计算后的日期
217. * num:必选,必须是数字,且正数是时期加,负数是日期减
218. * field:可选,标识是在哪个字段上进行相加或相减,字段见如下的约定。无此参数时,默认为d
219. * 约定如下格式:
220. * (1)Y/y 年
221. * (2)M 月
222. * (3)W/w 周
223. * (4)D/d 日
224. * (5)H/h 时
225. * (6)m 分
226. * (7)S/s 秒
227. * (8)Q/q 季
228. */
229.Date.prototype.dateAdd = function(num, field)
230.{
231.  if((!num)||isNaN(num)||parseInt(num)==0){
232.    return this;
233.  }
234.  if(!field){
235.    field = "d";
236.  }
237.  switch(field){
238.    case 'Y':
239.    case 'y':return new Date((this.getFullYear()+num), this.getMonth(), this.getDate(), this.getHours(), this.getMinutes(), this.getSeconds());break;
240.    case 'Q':
241.    case 'q':return new Date(this.getFullYear(), (this.getMonth()+num*3), this.getDate(), this.getHours(), this.getMinutes(), this.getSeconds());break;
242.    case 'M':return new Date(this.getFullYear(), this.getMonth()+num, this.getDate(), this.getHours(), this.getMinutes(), this.getSeconds());break;
243.    case 'W':
244.    case 'w':return new Date(Date.parse(this) + ((86400000 * 7) * num));break;
245.    case 'D':
246.    case 'd':return new Date(Date.parse(this) + (86400000 * num));break;
247.    case 'H':
248.    case 'h':return new Date(Date.parse(this) + (3600000 * num));break;
249.    case 'm':return new Date(Date.parse(this) + (60000 * num));break;
250.    case 'S':
251.    case 's':return new Date(Date.parse(this) + (1000 * num));break;
252.    default: return this;
253.  }
254.  return this;
255.}
256.
257.
258./**
259. * 比较日期差:比较两个时期相同的字段,返回相差值
260. * dtEnd:必选,必须是Data类型的实例
261. * field:可选,标识是在哪个字段上进行比较,字段见如下的约定。无此参数时,默认为d
262. * 约定如下格式:
263. * (1)Y/y 年
264. * (2)M 月
265. * (3)W/w 周
266. * (4)D/d 日
267. * (5)H/h 时
268. * (6)m 分
269. * (7)S/s 秒
270. */
271.Date.prototype.dateDiff = function(dtEnd, field)
272.{
273.  var dtStart = this;
274.  if((dtEnd instanceof Date)==false){
275.    return 0;
276.  }else{
277.    if(!field){
278.      field = "d";
279.    }
280.    switch(field){
281.      case 'Y':
282.      case 'y':return dtEnd.getFullYear() - dtStart.getFullYear();break;
283.      case 'M':return (dtEnd.getMonth()+1)+((dtEnd.getFullYear()-dtStart.getFullYear())*12) - (dtStart.getMonth()+1);break;
284.      case 'W':
285.      case 'w':return parseInt((dtEnd - dtStart) / (86400000 * 7));break;
286.      case 'D':
287.      case 'd':return parseInt((dtEnd - dtStart) / 86400000);break;
288.      case 'H':
289.      case 'h':return parseInt((dtEnd - dtStart) / 3600000);break;
290.      case 'm':return parseInt((dtEnd - dtStart) / 60000);break;
291.      case 'S':
292.      case 's':return parseInt((dtEnd - dtStart) / 1000);break;
293.      default: return 0;
294.    }
295.    return 0;
296.  }
297.}
298.
299.
300./**
301. * 把日期分割成数组:按数组序号分别为:年月日时分秒
302. */
303.Date.prototype.toArray = function()
304.{
305.  var myArray = new Array();
306.  myArray[0] = this.getFullYear();
307.  myArray[1] = this.getMonth();
308.  myArray[2] = this.getDate();
309.  myArray[3] = this.getHours();
310.  myArray[4] = this.getMinutes();
311.  myArray[5] = this.getSeconds();
312.  return myArray;
313.}
314.
315.
316./**
317. * 取得日期数据信息:
318. * field:可选,标识是在哪个字段上进行比较,字段见如下的约定。无此参数时,默认为d
319. * (1)Y/y 年
320. * (2)M 月
321. * (3)W/w 周
322. * (4)D/d 日
323. * (5)H/h 时
324. * (6)m 分
325. * (7)S/s 秒
326. */
327.Date.prototype.datePart = function(field)
328.{
329.  if(!field){
330.    field = "d";
331.  }
332.  var Week = ['日','一','二','三','四','五','六'];
333.  switch (field){
334.    case 'Y' :
335.    case 'y' :return this.getFullYear();break;
336.    case 'M' :return (this.getMonth()+1);break;
337.    case 'W' :