2010-07-25 11 views
14

W moim kodzie mam do czynienia z problemem. Przykładowy kod:'23/02/2011 12:34:56 'nie jest prawidłową datą i czasem

var 
    d1: tdatetime 
begin 
    d1 := strtodatetime('23/02/2011 12:34:56'); 
end; 

ale to daje błąd:

'23/02/2011 12:34:56' is not valid date and time

Co się stało z tym, co robię?

+2

Wygląda na to zagadnienie locale: To ważna data UK ale nie data amerykańska, na przykład. –

+5

Ostrzegałbym o funkcji "StrToDate [Time]" [s]: * "Uwaga, ta funkcja zależy od ustawień narodowych i może się nie udać na innych komputerach, dlatego nigdy nie powinieneś używać ciągów do wprowadzania, edycji lub przechowuj datę, nigdy! "*. –

Odpowiedz

31

funkcja StrToDateTime używa ShortDateFormat i DateSeparator aby przekształcić część daty i LongTimeFormat i TimeSeparator do części czasu. więc ciąg musi być zgodny z tymi zmiennymi, aby przekonwertować ciąg na TDateTime. zamiast tego możesz użyć parametru StrToDateTime z parametrem TFormatSettings, aby przeanalizować ciąg znaków.

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

Kontrola ta próbka

Var 
StrDate : string; 
Fmt  : TFormatSettings; 
dt  : TDateTime; 
begin 
fmt.ShortDateFormat:='dd/mm/yyyy'; 
fmt.DateSeparator :='/'; 
fmt.LongTimeFormat :='hh:nn:ss'; 
fmt.TimeSeparator :=':'; 
StrDate:='23/02/2011 12:34:56'; 
dt:=StrToDateTime(StrDate,Fmt); 
+0

Dlaczego używać 'nn' w' LongTimeFormat' zamiast 'mm' na minuty? – CinCout

+1

Ponieważ _nn_ oznacza minuty, a _mm_ oznacza miesiące. – RRUZ

+0

Dzięki za wyjaśnienia :) Nie zauważyłem niejasności. – CinCout

2

Jest to spowodowane tym, że format daty/czasu w kodzie jest niezgodny z formatem daty/czasu dla ustawień regionalnych.

Od docs (D2009):

The S parameter must use the current locale's date/time format. In the US, this is commonly MM/DD/YY HH:MM:SS format. Specifying AM or PM as part of the time is optional, as are the seconds. Use 24-hour time (7:45 PM is entered as 19:45, for example) if AM or PM is not specified.

Jeśli używasz starszej Delphi, StrToDateTime może wymagać określonego formatu. Od docs (D5 w tym przypadku):

The S parameter must be in the MM/DD/YY HH:MM:SS format. Specifying AM or PM as part of the time is optional, as are the seconds. Use 24-hour time (7:45 PM is entered as 19:45, for example) if AM or PM is not specified.

4

Korzystanie VarToDateTime może być o wiele prostsze i po prostu działa po wyjęciu z pudełka:

uses Variants; 

newDateTime := VarToDateTime('23/02/2011 12:34:56'); 
+0

Jeśli format daty i czasu jest podobny do "06. okt. 2015", wówczas nawet funkcja StrToDateTime (DateTimeToStr (Now)) kończy się niepowodzeniem. Ale VarToDateTime (zamiast StrToDateTime) działa dobrze. Wydaje się to najlepszą opcją. –

Powiązane problemy