0

我正在尝试在我的 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() 方法,因为这在我的排序功能部分不起作用。

提前致谢!

4

3 回答 3

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,则不再需要末尾的空间。

于 2012-11-30T19:13:50.320 回答
0

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

类似于: 按日期对 Javascript 对象数组进行排序

于 2012-11-30T19:14:26.780 回答
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 才能获得正确的值。

于 2015-03-05T08:29:44.043 回答