我正在尝试使用我的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函数部分。
提前致谢!
答案 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对象以进行比较吗?
答案 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才能获得正确的值。