验证本文件的两个日期;dd-MMM-yyyy“;javascript格式

验证本文件的两个日期;dd-MMM-yyyy“;javascript格式,javascript,validation,date,Javascript,Validation,Date,我有两个日期2010年8月18日和2010年8月19日。如何确定哪个日期更大?您需要创建一个自定义解析函数来处理所需的格式,并获取要比较的日期对象,例如: function customParse(str) { var months = ['Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec'], n = months.length, re = /(\d{2}

我有两个日期
2010年8月18日
2010年8月19日
。如何确定哪个日期更大?

您需要创建一个自定义解析函数来处理所需的格式,并获取要比较的日期对象,例如:

function customParse(str) {
  var months = ['Jan','Feb','Mar','Apr','May','Jun',
                'Jul','Aug','Sep','Oct','Nov','Dec'],
      n = months.length, re = /(\d{2})-([a-z]{3})-(\d{4})/i, matches;

  while(n--) { months[months[n]]=n; } // map month names to their index :)

  matches = str.match(re); // extract date parts from string

  return new Date(matches[3], months[matches[2]], matches[1]);
}

customParse("18-Aug-2010");
// "Wed Aug 18 2010 00:00:00"

customParse("19-Aug-2010") > customParse("18-Aug-2010");
// true

首先,“dd-MMM-yyyy”格式不是
Date
构造函数的可接受输入格式(它返回一个“无效日期”对象),因此我们需要自己解析它。让我们编写一个函数,从这种格式的字符串中返回一个
Date
对象

function parseMyDate(s) { var m = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec']; var match = s.match(/(\d+)-([^.]+)-(\d+)/); var date = match[1]; var monthText = match[2]; var year = match[3]; var month = m.indexOf(monthText.toLowerCase()); return new Date(year, month, date); }
对于给定的格式,您可以手动进行解析,但我建议您使用库解析日期到日期对象,然后进行比较。 看看,太棒了


此外,它是对js实用工具工具箱的一个很好的补充。

本机的
日期可以解析“MMM+dd-yyyy”,它给出:

function parseDMY(s){
  return new Date(s.replace(/^(\d+)\W+(\w+)\W+/, '$2 $1 '));
}
+parseDMY('19-August-2010') == +new Date(2010, 7, 19) // true
parseDMY('18-Aug-2010') < parseDMY('19-Aug-2010')     // true
function parseDMY(s){
返回新日期(s.replace(/^(\d+)\W+(\W+)\W+/,“$2$1”);
}
+parseDMY('2010年8月19日')==新日期(2010年7月19日)//true
parseDMY('2010年8月18日')
更新:IE10、FX30(可能还有更多)将理解“2010年8月18日”,而不使用破折号-镀铬手柄

因此
Date.parse(“2010年8月18日”.replace(“/-/g,”)
在这些浏览器(以及更多浏览器)中工作

因此

function compareDates(str1,str2) {
  var d1 = Date.parse(str1.replace("/-/g," ")),
      d2 = Date.parse(str2.replace("/-/g," "));
  return d1<d2;
}
功能比较(str1、str2){
var d1=Date.parse(str1.replace(“/-/g)”),
d2=Date.parse(str2.replace(“/-/g)”);

return d1您的问题可能与此问题重复:此处描述的解决方案应该对您有所帮助。文本语言是否保证为英语?@David无法理解您想说的内容?8月18日是特定于英语的…10月10日是英语,但是印尼语(例如)它将是10 Okt等…MMM描述依赖于语言…除非您保证使用特定语言而不是使用hackish
*1
hacks将结果转换为整数,否则您应该使用
parseInt(s.match(/(\d+)/g)[1],10)
来获取整数对象。使用OP的格式
s.match(/(\d+)/g);
将返回两元素数组,例如
“2010年8月12日”。匹配(/(\d+)/g);//[“12”,“2010”]
,您正在访问
1
2
索引。您还需要某种方法将三个字母的月份名称与月份编号进行映射…@Denis在这种情况下,我们甚至不需要将字符串转换为数字,将在内部将每个参数转换为
ToNumber
;)@CMS,我已经解决了这两个问题。修复了第一个问题通过删除“全局搜索”标记。通过使用
indexOf
进行搜索修复了第二个问题。@Delan,很好,您只需重新调整
日期和
年份的索引即可(并且您可以毫无问题地删除那些丑陋的
*1
):
function compareDates(str1,str2) {
  var d1 = Date.parse(str1.replace("/-/g," ")),
      d2 = Date.parse(str2.replace("/-/g," "));
  return d1<d2;
}