使用正则表达式在一位数日期的前面添加零

时间:2012-11-30 19:05:46

标签: javascript regex

我正在尝试使用我的javascript代码中的Regex对日期时间字符串进行排序,但遇到了问题。如果字符串“MM / DD / YYYY HH:MM:SS”的HH部分是一位数,我的程序会用缺少的数字对其进行排序,因此数字较小并且排序不正确。

我的正则表达式是这个(有问题的部分是粗体):

  

/ ^(\ d {1,2})[/ - ](\ d {1,2})[/ - ](\ d {4})[\ s]( \ d {1 ,2} )[\:](\ d {2})[\:](\ d {2})[\ s]([AP] M)?/ g

如果数字是一位数,有没有办法在HH的前面添加零?并且不使用任何.replace()方法,因为它不适用于我的sort函数部分。

提前致谢!

3 个答案:

答案 0 :(得分:0)

如果不使用replace,则无法修改字符串。您可以“标准化”与正则表达式匹配的日期:

var out = old
.replace(/^(\d\d?)[\/ -](\d\d?)[\/ -](\d{4})\s(\d\d?):(\d\d):(\d\d)(?:\s([AP]M))?/g
,function(x,m,d,y,h,i,s,a) {
    if( m.length == 1) m = "0"+m;
    if( d.length == 1) d = "0"+d;
    if( a == "PM") h = ""+((h%12)+12);
    if( a == "AM" && h == 12) h = "0";
    if( h.length == 1) h = "0"+h;
    return y+m+d+h+i+s;
});

对于今天的日期,这将返回:

20121130141320

日期组件从最大到最小排序,这意味着简单的.sort()调用会以正确的顺序排列日期而不用大惊小怪。

注意:我编辑了你的正则表达式,但它仍然匹配相同的东西。唯一的区别是,现在如果没有AM或PM,则不再需要末尾的空间。

答案 1 :(得分:0)

您可以调用自定义排序函数将字符串转换为Date对象以进行比较吗?

类似于:Sort Javascript Object Array By Date

答案 2 :(得分:0)

我对这个问题有点迟到,但在个人看来,我并不觉得在这方面使用正则表达式。我更喜欢在可能时保持简化,因此使用三元运算符:

// now (I'm posting at 03/05, so let's take this value)
var datev = new Date(); 

/* 
* here we will simply concatenate the value with a prefix "0" if the number
* is lower than 10. If not, concatenate the original value.
*/
var string_date = (datev.getMonth()+1 < 10 ? "0"+datev.getMonth()+1 : datev.getMonth()+1) + "/" + (datev.getDate() < 10 ? "0"+datev.getDate() : datev.getDate()); 

// display 03/05 instead of 3/5
console.log(string_date); 

想要添加这种方法来为这个主题带来一些变化。

注意:getMonth()返回0到11之间的值,因此您必须为其添加1才能获得正确的值。