[ mish_ns @ 17.08.2010. 10:37 ] @
Pozdrav svima...

Cuo sam da Delphi moze da cuva datume i kao extended tip. Tj, vrednost 1 odgovara npr. datumu 1.1.1977.
Da li je to tacno posto nisam uspeo da proguglam da se uverim u to?

Hvala
[ nikomak @ 17.08.2010. 13:56 ] @
Ovde se izgleda misli na Unix time, odnosno na broj sekundi proteklih od 1.1.1970, a ne 1977.
Unix time je u delphi-u predstavljen kao Int64, a ne kao Extended,
a TDateTime je double gde ceo broj predstavlja datum, a decimalni deo vreme.

U svakom slucaju
Code:

ShowMessage(DateToStr(UnixToDateTime(1))); // 1.1.1970
[ mish_ns @ 18.08.2010. 14:41 ] @
Probao sam ovo ali mi Delphi ne prepoznaje UnixToDateTime()

Kad uradim ovo:

ShowMessage(DateToStr(1));

dobijem ovaj datum 31.12.1899 :)

Danasnji datum je

ShowMessage(DateToStr(40408));
[ savkic @ 18.08.2010. 16:20 ] @
> Probao sam ovo ali mi Delphi ne prepoznaje UnixToDateTime()

Moraš ubaciti DateUtils u uses sekciju.

> Cuo sam da Delphi moze da cuva datume i kao extended tip. Tj, vrednost 1 odgovara npr. datumu 1.1.1977.
> Da li je to tacno posto nisam uspeo da proguglam da se uverim u to

Delphi može da čuva datume u bilo kom formatu, s tim što ako ne koristiš default format (TDateTime) i eventualno (TTimeStamp, TSystemTime i TSQLTimeStamp), svu neophodnu podršku moraš sam napisati. Dakle, ako imaš u nekom drugom program unix format datuma, možeš nastaviti da ga čuvaš kao takvog, možeš ga konvertovati u TDateTime ili već po želji. U svakom slučaju objasni detaljnije šta pokušavaš pa će neko moći ponuditi odgovarajuće rešenje.
[ mish_ns @ 18.08.2010. 21:48 ] @
Super HVALA, to je to...

Cisto sam pitao iz interesovanja...a i deluje mi kao dobro resenje za cuvanje datuma u bazi podataka.



[Ovu poruku je menjao mish_ns dana 18.08.2010. u 22:58 GMT+1]
[ rambo @ 19.08.2010. 07:00 ] @
Gotovo svi RDBMS imaju barem DATETIME a neki i DATE, TIME i TIMESTAMP tipove podataka. Kada želiš da u bazi držiš datum i/ili vreme, onda koristiš jedan od ovih tipova. Delphi to automatski prepoznaje i omogućava automatsku konverziju u druge kompatibilne tipove (String, Float, Integer, ...).

Što se Delphija tiče, jedino je TSQLTimeStamp specifičan jer čuva svaki element datuma i vremena posebno (Godine, meseci, dani, i td.). TSQLTimeStamp je veoma moćan tip jer dozvoljava neke manipulacije koje su sa standardnim TDateTime kompleksnije. TDateTime je recimo pogodan za upis u običan fajl (pod uslovom da se čuva kao Extended tip). Čuvanje u String formatu može da bude problematično zbog različitih regionalnih podešavanja na različitim računarima.

Što se tiče funkcija koje manipulišu sa TDateTime i ostalim sličnim tipovima, obavezno pogledaj DateUtils unit. Mnogi Delphi programeri kasno saznaju za taj unit, a tamo ima veliki broj pomoćnih funkcija koje mogu da pomognu u gotovo svim situacijama.
[ tkaranovic @ 19.08.2010. 09:19 ] @
Da se nadovezem u vezi DateUtils.

UnixToDateTime zna da da razliku od jedne sekunde. Koliko sam video i Indy DateTimeToUnix radi isto.

Preciznije je ovo:
Code:

function UnixToDateTime2(const AValue: Int64): TDateTime;
var TimeStamp: TTimeStamp;
begin
  //693594  31.12.1899 broj dana od 01.01.0000 delphi datum
  //719163  01.01.1970  broj dana od 01.01.0000 unix datum
  //719163-693594 = UnixDateDelta ili razlika dana delphi - unix
  TimeStamp.Time := (AValue mod SecsPerDay) * 1000;
  TimeStamp.Date := (AValue div SecsPerDay) + 719163;
  Result := TimeStampToDateTime(TimeStamp);
end;

Može i ovo, umesto DateTimeToUnix, ali nije preciznije:
Code:

function DateTimeToUnix2(const AValue: TDateTime): Int64;
var TimeStamp: TTimeStamp;
begin
  TimeStamp := DateTimeToTimeStamp(AValue);
  Result := (TimeStamp.Date - 719163)* SecsPerDay+(TimeStamp.Time div 1000);
end;