2010-03-23 25 views
14

Tôi đang tìm kiếm một chức năng để đảo ngược bất kỳ string (YYYYMDD, YY/MM/DD, YYMMDD ...) tạo ra bởi các chức năng FormatDateTime để datetime.chức năng Inverse của FormatDateTime

dụ

Tôi có một chuỗi ngày ở định dạng YYYYMMDD tạo ra bởi FormatDateTime

mydatestr:=FormatDateTime('YYYYMMDD',Mydate); 

nay làm thế nào tôi có thể chuyển đổi mydatestr để DateTime một lần nữa?

CẬP NHẬT

các chức năng này

function StrToDate(const S: string): TDateTime; overload; 
function StrToDate(const S: string; 
    const FormatSettings: TFormatSettings): TDateTime; overload; 

function StrToDateTime(const S: string): TDateTime; overload; 
function StrToDateTime(const S: string; 
    const FormatSettings: TFormatSettings): TDateTime; overload; 

không hỗ trợ thông qua một chuỗi với định dạng để chuyển đổi.

Tôi đang tìm kiếm một cái gì đó như thế này

Mydatetime:=InvFormatDatetime('20091225','yyyymmdd'); 

hoặc

Mydatetime:=InvFormatDatetime('20090108','yyyyddmm'); 
+0

bản sao có thể có của [Làm thế nào để chuyển đổi chuỗi ISO 8601 thành một TDDC Delphi?] (Http://stackoverflow.com/questions/6651829/how-do-i-convert-an-iso- 8601-string-to-a-delphi-tdate) – NGLN

Trả lời

9

Nó là khá dễ dàng với các giải pháp hiện có, chức năng StrToDateFmt trong đơn vị rxDateutil.pas từ gói RX, có thể được tải về tại đây: http://sourceforge.net/projects/rxlib/

EDIT:

Đề cập ở trên chức năng và StrToDateFmt từ rxDateutil.pas được thực hiện chính xác những gì bạn mong đợi, chuyển chuỗi thành datetime bằng cách sử dụng mặt nạ chuỗi được chỉ định, mã quá lớn để được bao gồm vì đơn vị này cũng chứa các hàm ngày khác, một số trong số chúng cần để chuyển đổi chuỗi cho đến ngày.

Ví dụ về sử dụng:

Result := StrToDateFmtDef('MM/DD/YYYY', '11/11/2011', Now); 
+0

cảm ơn rất nhiều, chức năng hoạt động rất tốt. – Salvador

+1

Chức năng này cũng đã được chuyển đến JVCL. Nó nằm trong đơn vị "JvJCLUtils" – awmross

+1

Lưu ý rằng StrToDateFmt chỉ thực hiện các ngày thuần túy. Nó sẽ không ví dụ chuyển đổi 'yyyymmddhhmmss'. –

1

Bạn đã kiểm tra StrToDate và StrToDateTime?

+0

Gah! Tôi đã ninja! x.x +1 –

+0

@Liz, tôi biết các chức năng này và chúng không hỗ trợ chức năng mà tôi đang tìm kiếm. – Salvador

0
Function InvFormatDatetime (Cadena:String; Formato:String) : TDateTime; 

Var 
    PosD, PosM, PosY : Integer; 
    sD, sM, sY  : String; 

begin 

    sd := '0'; 
    sm := '0'; 
    sy := '0'; 

    If Length(Cadena) = Length(Formato) Then 
    Begin 
     Formato := UpperCase(Formato); 
     PosD := Pos('D',Formato); 
     PosM := Pos('M',Formato); 
     PosY := Pos('Y',Formato); 

     sd := Copy(Cadena,PosD,2); 
     sm := Copy(Cadena,PosM,2); 

     if Length(Cadena) = 6 then 
     begin 
      sy := Copy(Cadena,PosY,2); 
      if StrToInt(sy) > 50 then 
      sy := '19'+sy 
      else 
      sy := '20'+sy; 
     end 
     else 
     sy := Copy(Cadena,Posy,4); 
    End; 
    Result := EncodeDate(StrToInt(sY), 
         StrToInt(sM), 
         StrToInt(sD)); 
End; 

lời chào

+0

Chức năng này giả định rằng các định dạng ngày và tháng duy nhất được sử dụng là DD và MM, khi chúng thực tế có thể dài từ 1 đến 4 ký tự và bất kỳ định dạng nào amy xuất hiện nhiều lần. Mã này cũng bỏ qua 'TwoDigitYearCenturyWindow'. –

-3

Thông thường, tôi sẽ chỉ cần chèn ký tự cần thiết để có được StrToDate để làm việc.

3

Bạn có thể sử dụng StrToDateFmt chức năng của đơn vị JvJCLUtils thuộc JEDI Code Library

trong trường hợp của bạn:

Function InvFormatDatetime (dateString :String; dateFormat :String) : TDateTime; 
begin 
    Result := JvJCLUtils.StrToDateFmt (dateFormat, dateString); 
end; 
1

Nếu không sử dụng bất kỳ thư viện bên ngoài, bạn có thể làm một cái gì đó như:

function AnyStringToDate(fmt, dt: String) : TDateTime; 
var 
    fs : TFormatSettings; 
Begin 
    fs := TFormatSettings.Create; 
    fs.ShortDateFormat := fmt; 

    result := StrToDateDef(dt, 0, fs); 
End; 

và sau đó sử dụng nó như:

mydate := AnyStringToDate('YYYY-MM-DD', '2015-01-20'); 

Tôi đã không biên soạn điều này, nhưng ý tưởng đơn giản.

3

Tôi thích câu trả lời của Tuncay nhưng có một số vấn đề với nó.Tôi đã để lại một bình luận nhưng tôi không có đủ điểm danh tiếng.

Vì vậy, đây là phiên bản chỉnh sửa của câu trả lời Tuncay của (sửa đổi "TFormatSetting" thiếu một "s" và quy định các thiết lập định dạng Date separator):

function AnyStringToDate(fmt, dt: String) : TDateTime; 
var 
    fs : TFormatSettings; 
Begin 
    fs := TFormatSettings.Create; 
    fs.DateSeparator := '-'; 
    fs.ShortDateFormat := fmt; 

    result := StrToDateDef(dt, 0, fs); 
End; 

giống hệt với câu trả lời Tuncay của, AnyStringToDate có thể được sử dụng như sau :

mydate := AnyStringToDate('YYYY-MM-DD', '2015-01-20'); 
+0

Cảm ơn bạn đã khắc phục! –

Các vấn đề liên quan