验证日期时间格式的正则表达式 - 勤能补拙

时间:2024-03-13 21:17:20

验证日期时间格式的正则表达式

 
  //判断日期:年-月-日(2005.12.25、2005年12月2号、2005/10/23,2005-11-28)、年-月(05年12月)、月-日(12-30、10/30、10.30、10月30号)
  private static System.Text.RegularExpressions.Regex reg_isDate=new  System.Text.RegularExpressions.Regex ("^(?:(31)(\\D)(0?[13578]|1[02])\\2|(29|30)(\\D)(0?[13-9]|1[0-2])\\5|(0?[1-9]|1\\d|2[0-8])(\\D)(0?[1-9]|1[0-2])\\8)((?:1[6-9]|[2-9]\\d)?\\d{2})$|^(29)(\\D)(0?2)\\12((?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:16|[2468][048]|[3579][26])00)$");
  /// <summary>
  /// 验证时间格式:12:23:34或00:00:1或8:3:42
  /// </summary>
  private static System.Text.RegularExpressions.Regex reg_isTime=new Regex(@"^((0?\d|1[0-9]|2[0-3])|((0?\d|1[0-9]|2[0-3]):(0?\d|[0-5]\d)(:(0?\d|[0-5]\d)){0,1}))$");


  /// <summary>
  /// 判断日期:年-月-日(2005.12.25、2005年12月2号、2005/10/23,2005-11-28)、年-月(05年12月)、月-日(12-30、10/30、10.30、10月30号)  
  /// </summary>
  /// <param name="expression"></param>
  /// <returns></returns>
  public static bool IsDate(ref string expression)
  {
   string text=expression;
   bool existDay=true;//当日期格式为05年12月时使用。
   //格式转换======================
   int indexExist=text.IndexOf(\'-\');
   if(indexExist<0)
   {
    indexExist=text.IndexOf(\'/\');      
    if(indexExist>0)
    {
     text=text.Replace(\'/\',\'-\');
    }// 日期以‘/’为分隔符,将其转换为‘-’
    else
    {
     indexExist=text.IndexOf(".");
     if(indexExist>0)
     {
      text=text.Replace(".","-");
     }// 日期以‘.’为分隔符,将其转换为‘-’     
     else
     {
      indexExist=text.IndexOf("月");
      if(indexExist>0)
      {
       existDay=text.IndexOf("号")>0||text.IndexOf("日")>0?true:false;

       text=text.Replace(\'年\',\'-\');
       text=text.Replace(\'月\',\'-\');
       text=text.Replace("日","");
       text=text.Replace("号","");
      }// 日期以‘年,月,日’为分隔符,将其转换为‘-’      
     }//else 日期不是以‘.’为分隔符     
    }//else 日期不是以‘/’为分隔符    
   }//else 日期不是以‘-’为分隔符    
   
   //====================格式转换

   int index=text.IndexOf(\'-\');  
   if(index>0)
   {
    if(!existDay)//2005年12月或05年12月
    {     
     text=text+System.DateTime.Now.Day.ToString();
     index=text.IndexOf(\'-\');     
    }
    else if(text.Length<6) //只有月和日,添加系统日期的年份
    {
     text=System.DateTime.Now.Year.ToString()+"-"+text;
     index=text.IndexOf(\'-\');
    }

    //将年月日换为日月年,供判断
    string year=text.Substring(0,index);
    text=text.Remove(0,index);
    string day=text.Substring(text.LastIndexOf(\'-\')+1);
    text=text.Remove(text.LastIndexOf(\'-\')+1,day.Length);
    text=day+text+year;
   }//if index  
   if(reg_isDate.Match(text).Success)
   {
    expression=text;
    return true;
   }
   else
   {
    return false;
   }
  }//public
  
  /// <summary>
  /// 验证时间格式:12:23:34或00:00:1或8:3:42,12点23分23秒,12点,12点23分
  /// </summary>
  /// <param name="expression"></param>
  /// <returns></returns>
  public static bool IsTime(ref string expression)
  {
   string text=expression;
   if(text.IndexOf(":")<0)
   {
    int fenIndex=text.IndexOf("时");
    int dianIndex=text.IndexOf("点");
    int index=fenIndex>0?fenIndex:dianIndex;
    if(index>0&&text.Length>index+1)
    {
     text=text.Replace("时",":");
     text=text.Replace("点",":");
     //判断分的格式
     if(text.IndexOf("分")>0)
     {
      if(text.Length>(text.IndexOf("分")+1)) 
      {
       text=text.Replace("分",":");
       //判断秒的格式
       if(text.IndexOf("秒")>0&&text.Length<=(text.IndexOf("秒")+1))
       {
        text=text.Replace("秒","");    
       }
       else//有“秒”的值,但没有“秒”这个字符
       {
        text+="time Error";
       }
      }
      else//没有秒
      {
       text=text.Replace("分","");
      }
     }
     else //有“分”的值,但没有“分”这个字符
     {
      text+="time Error";
     }
    }// if 时
    else
    {
     text=text.Replace("时","");
     text=text.Replace("点","");
    }// else if index
   }//if text.IndexOf(":")
   if(reg_isTime.Match(text).Success)
   {
    expression=text;
    return true;
   }
   else
   {
    return false;
   }   
  }