Newsgroup: it.comp.lang.delphi
Titolo: StrToDateTime, TFormatSettings e nomi dei mesi a tre cifre

Devo convertire una stringa contenente una data e un orario in un
TDateTime.
Un esempio della stringa che mi potrebbe capitare è:
 
07%3A04%3A34+Sep+20%2C+2011
 
con la quale si intende 07:04:34 Sep 20 2011 (20 Settembre 2011 ore 7,
4 minuti e 34 secondi).
 
Il codice è questo:
 
var
  [...]
  MyFormatSettings: TFormatSettings;
  DateString, TimeString: String;
begin
  [...]
  MyFormatSettings := TFormatSettings.Create('en-US');
  MyFormatSettings.DateSeparator := '/';
  MyFormatSettings.TimeSeparator := ':';
  MyFormatSettings.ShortDateFormat := 'mmm/dd/yyyy';
  MyFormatSettings.LongTimeFormat := 'hh:nn:ss';
 
  DateString := Copy(params.Values['payment_date'], 14, 14);
  DateString := StringReplace(DateString, '+', '/', [rfReplaceAll,
rfIgnoreCase]);
  DateString := StringReplace(DateString, '%2C', '', [rfReplaceAll,
rfIgnoreCase]);
  TimeString := Copy(params.Values['payment_date'], 1, 12);
  TimeString := StringReplace(TimeString, '%3A', ':', [rfReplaceAll,
rfIgnoreCase]);
 
  Result.PaymentDateTime := StrToDateTime(DateString + ' ' +
TimeString, MyFormatSettings);
end;
 
Mi da sempre un errore di conversione.
 
Ho letto che la funzione StrToDateTime non converte le date quando i
nomi dei mesi sono nel formato a tre lettere. Come soluzione viene
proposto l'utilizzo di VarToDateTime ma mi risponde sempre che non può
convertire variant di tipo Unicodestring.
 
Qualche suggerimento?
 
Grazie
Francesco

 Mi da sempre un errore di conversione.
 
La tua stringa originale passa attraverso diversi rimpiazzi di stringhe 
e altre manipolazioni... hai provato a verificare (in fase di debugging) 
qual è l'esito finale di queste operazioni?
 
In caso affermativo, qual è il valore della stringa? Eventualmente 
riportalo qui con un copia/incolla così lo verifichiamo.
 
Ciao,
   Marco.
 
-- 
Marco Breveglieri
   (
http://www.marco.breveglieri.name
)

var
  AYear, AMonth, ADay, AHour, AMinute, ASecond: Word;
begin
  Edit2.Text:=StringReplace('07%3A04%3A34+Sep+20%2C
+2011','%3A',TimeSeparator,[rfReplaceAll]);
  Edit2.Text:=StringReplace(Edit2.Text,'%2C+',' ',[rfReplaceAll]);
  Edit2.Text:=StringReplace(Edit2.Text,'+',' ',[rfReplaceAll]);
 
  AHour:=StrToInt(copy(Edit2.Text,0,2));
  AMinute:=StrToInt(copy(Edit2.Text,4,2));
  ASecond:=StrToInt(copy(Edit2.Text,7,2));
  AYear:=StrToInt(copy(Edit2.Text,17,4));
  AMonth:=StrToInt(copy(Edit2.Text,14,2));
  if copy(Edit2.Text,10,3)='Sep' then
    ADay:=9;
........
 
poi con un'istruzione EncodeDateTime passa i valori delle variabili
alla tua varibile di tipo DateTime
questo metodo funziona ma se lavori sui formati delle date di sistema
eviti un bel po' di problemi. fammi sapere
 
 

 ........
ADay := Round(Pos('___JanFebMarAprMayJunJulAugSepOctNovDec',
copy(Edit2.Text,10,3)) /3);
 
così eviti tutti gli if, ciao Brunello


akalb e Brunello, la vostra situazione mi sembra molto buona, ma
possibile che Delphi non sia in grado di convertire da una stringa che
lui stesso è in grado di generare a partire da una data?
Marco la stringa dalla quale parto, appena dopo aver eseguito:
DateString := Copy(params.Values['payment_date'], 14, 14);
potrebbe, ad esempio, essere la seguente:
'Sep+23%2C+2011'
Poi dopo aver eseguito:
 DateString := StringReplace(DateString, '+', '/', [rfReplaceAll,
rfIgnoreCase]);
  DateString := StringReplace(DateString, '%2C', '', [rfReplaceAll,
rfIgnoreCase]);
Ottengo, per la sola data, la stringa:
'Sep/23/2011'
Per l'ora, più o meno, faccio la stessa cosa, ottenendo, alla fine, ad
esempio:
'01:03:32'
Quindi l'argomento che do alla funzione StrToDateTime (DateString + '
' +
TimeString, MyFormatSettings) potrebbe essere questo:
'Sep/23/2011 01:03:32'

 'Sep/23/2011 01:03:32'
Non sono sicuro che quella stringa sia effettivamente valida da convertire.
Anche il mese espresso in quel modo non sono convinto (ma potrei ricordare male) che si possa elaborare direttamente.



All fine, grazie alle vostre risposte, ho partorito questa funzioncina
che, partendo dalla stringa (che per inciso è la data che restituisce
PAYPAL dopo aver effettuato una transazione), restituisce un
TDateTime.
 
Ricordo che la stringa di partenza potrebbe essere questa:
 
07%3A04%3A34+Sep+20%2C+2011+PDT
 
function PaypalDateToTDateTime(PaypalDate: String): TDateTime;
var
  DateString, TimeString: String;
  TheMonth: Integer;
  MyFormatSettings: TFormatSettings;
begin
  MyFormatSettings := TFormatSettings.Create('en-US');
  MyFormatSettings.DateSeparator := '/';
  MyFormatSettings.TimeSeparator := ':';
  MyFormatSettings.ShortDateFormat := 'm/dd/yyyy';
  MyFormatSettings.LongTimeFormat := 'hh:nn:ss';
 
  DateString := Copy(PaypalDate, 14, 14);
  DateString := StringReplace(DateString, '+', '/', [rfReplaceAll,
rfIgnoreCase]);
  DateString := StringReplace(DateString, '%2C', '', [rfReplaceAll,
rfIgnoreCase]);
  TheMonth := Round(Pos(copy(DateString,1,3),
'___JanFebMarAprMayJunJulAugSepOctNovDec') /3);
  DateString := IntToStr(TheMonth) + Copy(DateString, 4,
Length(DateString));
  TimeString := Copy(PaypalDate, 1, 12);
  TimeString := StringReplace(TimeString, '%3A', ':', [rfReplaceAll,
rfIgnoreCase]);
  Result := StrToDateTime(DateString + ' ' + TimeString,
MyFormatSettings);
end;
 
Grazie