Newsgroup: it.comp.lang.delphi
Titolo: Problema con FormatDateTime

Su un programma ho bisogno di fare dei confronti con delle date
salvate in un file di testo nel formato gg/mm/aa.
Fintantochč il programma lavora su un OS in versione italiana utilizzo
FormatDateTime('dd/mm/yy', Date) e confronto il risultato con la mia
stringa senza problemi.
Quando invece il programma gira su OS in versioni diverse (testato su
versioni inglese e tedesca di win2k) la funzione formatdatetime non
restituisce quanto desiderato.
Ad esempio nella versione tedesca il formato breve della data č
impostato in dd.mm.yy e provando a formattarlo in dd/mm/yy mi ritorna
sempre e comunque dd.mm.yy, come se il DateSeparator / venisse
ignorato.
Esiste un modo pratico per risolvere questo problema?

 salvate in un file di testo nel formato gg/mm/aa.
Potresti ri-convertire in TDateTime con (Date)(Time)ToStr
Per i confronti poi usi <, >, <> o al limite estrai le singole
informazioni con DecodeDate e DecodeTime.
--
Ciao !  Davide DG.

informazioni con DecodeDate e DecodeTime.
Cioe', fammi capire, tu faresti un confronto tra 
10/02/1927 e 08/03/1932 
come stringhe ?
--
Andrea Laforgia - walkietalkie(at)
libero.it
http://www.geocities.com/AndreaLaforgia

 come stringhe ?
Eheheh... no :)
Volevo scrivere StrTo(Date)(Time), non (Date)(Time)ToStr


 salvate in un file di testo nel formato gg/mm/aa.
Prova con la funzione EncodeDate.
Ciao, Angelo Diego Crabolu.

Volevo scrivere StrTo(Date)(Time), non (Date)(Time)ToStr
Già provato. Il problema è che su sistemi in cui il formato data è
diverso, ad es. dd.mm.yy, se provo a convertire la stringa mi dice che
dd/mm/yy non è un formato data valido (tra l'altro ci sarebbe il
problema dell'anno a 2 o 4 cifre ma è facilmente risolvibile).
Riassumendo:
avendo ShortDateFormat settato a dd.mm.yy
DateToStr('dd/mm/yy') ritorna formato non valido
FormatDateTime('dd/mm/yy',Date) ritorna dd.mm.yy invece di quanto
richiesto ignorando il DateSeparator.
Senza contare le incongruenze del tipo:
StrToDate('dd/mm/yy') <> StrToDate ('dd/mm/yyyy')
Siccome non mi fido più della funzione FormatDateTime, a questo punto,
la soluzione più pulita dovrebbe essere:
DecodeDate(Date, Year, Month, Day);
Risultato:=IntToStr(Day)+'/'+IntToStr(Month)+'/'+IntToStr(Year);
o l'inverso con EncodeDate
E si che ci avevo ragionato su del tempo, quando la soluzione era
abbastanza stupida :)


Guarda se questo esempio ti può essere utile
procedure TForm1.Button1Click(Sender: TObject);
begin
  DateSeparator := '-';
  DateFullYear := True;
  DateLeadZero := True;
  Label1.Caption := DateToStr(Date);
end;
Viene dall'help di delphi alla vode DateSeparator
--
Massimo
mago_merlino(at)
bigfoot.com

Viene dall'help di delphi alla vode DateSeparator
A parte che in Delphi 5 DateFullYear e DateLeadZero sembrano non
essere dichiarate, si ottengono risultati strani.
Riducendo il codice in questo modo:
begin
  DateSeparator := '-';
  Label1.Caption := DateToStr(Date);
end;
Se in pannello di controllo, impostazioni internazionali, data,
formato breve andiamo a mettere la stringa gg/MM/aa, nella label il
valore ritornato è gg-MM-aa (quindi la modifica al dateseparator viene
considerata).
Se invece il formato breve è impostato in gg.MM.aa (come in win
localizzato per la germania), eseguendo il programma la caption della
label è gg.MM.aa (quindi il dateseparator è ignorato).

end;
Con il seguente esempio, compilato su D6 e Windows 2000:
procedure TForm1.Button1Click(Sender: TObject);
begin
  DateSeparator := '-';
  ShortDateFormat := 'm/d/yyyy';
  Label1.Caption := DateToStr(Date);
end;
Se nelle impostazioni internazionali si imposta come
separatore il . (punto) o /, il DateSeparator viene
considerato.


considerato.
Si, colpa mia, avevo settato il formato data breve ma non il date
separator. Effettivamente funziona anche cosě.

Il datetime separator e le altre variabiline 
che mette gentilmente a disposizione delphi
vivono solo all'interno della singola esecuzione di un pgm e, per questo le
modifiche che si fanno non vengono salvate alla chiusura del pgm.
Quindi, se volete che questo invece accada, dovete usare la SetLocaleInfo
e la GetLocaleInfo per leggere i valori di sistema.
Spero la mia precisazione possa essere utile.
PS - l'utilizzo delle API è molto semplice
-- 
Posted from 
sita.adsl.fol.it
 [213.26.241.44] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG