Javascript 解析,格式化日期(改善版)
大家知道,js没有自带的日期字符转化工具,网上流传有很多日期转化函数,如 parseDate ,但是很不幸的,当你的时间月份为 08 或09时,你就会发现转化后日期总是12月份,奇怪吧!!!!
问题发生在parseInt函数,parseInt语法:parseInt(string, radix);
其中string为要转换的字符串,radix为二进制,八进制,十六进制或十进制。
在默认不指定radix时,当以0x开关时,为十六进制;如果以08表示八进制转化,(因为八进制不能有8,9所以报错返回0,即12月份)。
知道了原因,就好解决了,以下是完善后的代码
1 /*
2 parseDate('2010-1-1') return new Date(2010,0,1)
3 4 parseDate(' 2010-1-1 ') return new Date(2010,0,1)
4 5 parseDate('2010-1-1 15:14:16') return new Date(2010,0,1,15,14,16)
5 6 parseDate(' 2010-1-1 15:14:16 ') return new Date(2010,0,1,15,14,16);
6 7 parseDate('2010-1-1 15:14:16.254') return new Date(2010,0,1,15,14,16,254)
7 8 parseDate(' 2010-1-1 15:14:16.254 ') return new Date(2010,0,1,15,14,16,254)
8 9 parseDate('不正确的格式') retrun null
9 10*/
10 function parseDate(str){
11 if(typeof str == 'string'){
12 var results = str.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) *$/);
13 if(results && results.length>3){
14 return new Date(parseInt(results[1],10),(parseInt(results[2],10) -1),parseInt(results[3],10));
15 }
16 results = str.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2}) *$/);
17 if(results && results.length>6)
18 return new Date(parseInt(results[1],10),parseInt(results[2],10) -1,parseInt(results[3],10),parseInt(results[4],10),parseInt(results[5],10),parseInt(results[6],10));
19 results = str.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2})\.(\d{1,9}) *$/);
20 if(results && results.length>7)
21 return new Date(parseInt(results[1],10),parseInt(results[2],10) -1,parseInt(results[3],10),parseInt(results[4],10),parseInt(results[5],10),parseInt(results[6],10),parseInt(results[7],10));
22 }
23 return null;
24 }
25
26
27 /*
28 将Date/String类型,解析为String类型.
29 传入String类型,则先解析为Date类型
30 不正确的Date,返回 ''
31 如果时间部分为0,则忽略,只返回日期部分.
32 */
33 function formatDate(v){
34 if(typeof v == 'string') v = parseDate(v);
35 if(v instanceof Date){
36 var y = v.getFullYear();
37 var m = v.getMonth() + 1;
38 var d = v.getDate();
39 var h = v.getHours();
40 var i = v.getMinutes();
41 var s = v.getSeconds();
42 var ms = v.getMilliseconds();
43 if(ms>0) return y + '-' + m + '-' + d + ' ' + h + ':' + i + ':' + s + '.' + ms;
44 if(h>0 || i>0 || s>0) return y + '-' + m + '-' + d + ' ' + h + ':' + i + ':' + s;
45 return y + '-' + m + '-' + d;
46 }
47 return '';
48 }
2 parseDate('2010-1-1') return new Date(2010,0,1)
3 4 parseDate(' 2010-1-1 ') return new Date(2010,0,1)
4 5 parseDate('2010-1-1 15:14:16') return new Date(2010,0,1,15,14,16)
5 6 parseDate(' 2010-1-1 15:14:16 ') return new Date(2010,0,1,15,14,16);
6 7 parseDate('2010-1-1 15:14:16.254') return new Date(2010,0,1,15,14,16,254)
7 8 parseDate(' 2010-1-1 15:14:16.254 ') return new Date(2010,0,1,15,14,16,254)
8 9 parseDate('不正确的格式') retrun null
9 10*/
10 function parseDate(str){
11 if(typeof str == 'string'){
12 var results = str.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) *$/);
13 if(results && results.length>3){
14 return new Date(parseInt(results[1],10),(parseInt(results[2],10) -1),parseInt(results[3],10));
15 }
16 results = str.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2}) *$/);
17 if(results && results.length>6)
18 return new Date(parseInt(results[1],10),parseInt(results[2],10) -1,parseInt(results[3],10),parseInt(results[4],10),parseInt(results[5],10),parseInt(results[6],10));
19 results = str.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2})\.(\d{1,9}) *$/);
20 if(results && results.length>7)
21 return new Date(parseInt(results[1],10),parseInt(results[2],10) -1,parseInt(results[3],10),parseInt(results[4],10),parseInt(results[5],10),parseInt(results[6],10),parseInt(results[7],10));
22 }
23 return null;
24 }
25
26
27 /*
28 将Date/String类型,解析为String类型.
29 传入String类型,则先解析为Date类型
30 不正确的Date,返回 ''
31 如果时间部分为0,则忽略,只返回日期部分.
32 */
33 function formatDate(v){
34 if(typeof v == 'string') v = parseDate(v);
35 if(v instanceof Date){
36 var y = v.getFullYear();
37 var m = v.getMonth() + 1;
38 var d = v.getDate();
39 var h = v.getHours();
40 var i = v.getMinutes();
41 var s = v.getSeconds();
42 var ms = v.getMilliseconds();
43 if(ms>0) return y + '-' + m + '-' + d + ' ' + h + ':' + i + ':' + s + '.' + ms;
44 if(h>0 || i>0 || s>0) return y + '-' + m + '-' + d + ' ' + h + ':' + i + ':' + s;
45 return y + '-' + m + '-' + d;
46 }
47 return '';
48 }