我想将用户输入的各种式样的日期格式都转化成‘2009-12-01’这种格式,如何实现?输入的格式可能是:2009.01.01    2009.1.1    2009.1.01    
                  2009/01/01    2009/1/1    2009/1/01
                  2009 01 01    2009 01 1   2009 1 1
   还有可能缺少   日  的部分,缺的就补1进去,如:2009.01  就转成  2009-01-01    还有可能是中文的  2009年1月1日这样的函数 要怎样实现?
谢谢
   

解决方案 »

  1.   

    FormatdateTime 应该可以满足你的要求
      

  2.   

    用户输入使用DateTimePicker1
    保存到数据库格式为:FormatdateTime('yyyy-mm-dd',DateTimePicker1.DateTime);
      

  3.   

    function NormalizDate(const Value : String):String;
    var
      OldP : PChar;
      P : PChar;
      procedure SkipBlank();
      begin
        while not(p^ in ['0'..'9']) do
          Inc(P);
      end;
      procedure SkipNumber(MaxLen : Integer);
      var
        len : Integer;
      begin
        Len := 0;
        while (p^ in ['0'..'9'])and(len < MaxLen) do
        begin
          Inc(P);
          Inc(Len);
        end;
      end;
    var
      y,m,d : string;
      ny,nm,nd : Integer;
    begin
      P := PChar(Value);
      //获取年的部分
      SkipBlank();
      OldP :=P;
      SkipNumber(4);
      SetString(y, OldP, p - oldP);  //获取月的部分
      SkipBlank();
      OldP :=P;
      SkipNumber(2);
      SetString(m, OldP, p - oldP);
      //获取日的部分
      SkipBlank();
      OldP :=P;
      SkipNumber(2);
      SetString(d, OldP, p - oldP);
      //
      if not TryStrToInt(y, ny) then
        ny := 2000;
      if not TryStrToInt(m, nm) then
        nm := 1;
      if not TryStrToInt(d, nd) then
        nd := 1;
      //整合
      Result := Format('%0.4d-%0.2d-%0.2d',[ny,nm,nd]);
    end;
    话3分钟写了一个.理论上可以满足楼主的要求
      

  4.   

    function NormalizDate(const Value : String):String;
    var
      OldP : PChar;
      P : PChar;
      procedure SkipBlank();
      begin
        while not(p^ in ['0'..'9']) do
        begin
          if p^ = #0 then
            Break;
          Inc(P);
        end;
      end;
      procedure SkipNumber(MaxLen : Integer);
      var
        len : Integer;
      begin
        Len := 0;
        while (p^ in ['0'..'9'])and(len < MaxLen) do
        begin
          if p^ = #0 then
            Break;
          Inc(P);
          Inc(Len);
        end;
      end;
    var
      y,m,d : string;
      ny,nm,nd : Integer;
    begin
      P := PChar(Value);
      //获取年的部分
      SkipBlank();
      OldP :=P;
      SkipNumber(4);
      SetString(y, OldP, p - oldP);  //获取月的部分
      SkipBlank();
      OldP :=P;
      SkipNumber(2);
      SetString(m, OldP, p - oldP);
      //获取日的部分
      SkipBlank();
      OldP :=P;
      SkipNumber(2);
      SetString(d, OldP, p - oldP);
      //
      if not TryStrToInt(y, ny) then
        ny := 2000;
      if not TryStrToInt(m, nm) then
        nm := 1;
      if not TryStrToInt(d, nd) then
        nd := 1;
      //整合
      Result := Format('%0.4d-%0.2d-%0.2d',[ny,nm,nd]);
    end;
    改了一点.加了个防止字符串不够长的限制
      

  5.   

    是这种方法,顶一下>>>>>>>>>>
      

  6.   

    有个一劳永逸的办法,就是给System的LongDateTimeFormat,ShortDateTimeFormat赋值,如:
    LongDateTimeFormat = 'YYYY-MM-DD HH:NN:SS';
      

  7.   

    FormatdateTime('yyyy-mm-dd',Now)这个方法是可行的>>>>>>>>>>>>