Autor Téma: Funkce Now nevrací správný čas.  (Přečteno 268 krát)

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 103
  • Karma: 0
Funkce Now nevrací správný čas.
« kdy: 04-12-2017, 15:34:20 »
Vážená komunito,
již delší dobu mám podezření na funkci Now (z SysUtils) vracející TDateTime hodnotu aktuálního času. Do databáze se mi čas od času ukládají chybné časy. Kód je jednoduchý a přímočarý. Momentálně pracuji na nějakém logovacím mechanismu, abych měl důkaz. Dnes jsem narazil na další chybu této funkce: Vytvářím si kopiie souborů ve speciální složce. Po kopii využívám FileSetDate(soubor, DateTimeToFileDate(Now)) aby měl soubor nejaktuálnější datum. Toto však dopadne tak jednou z dvaceti případů. Čas od času se stane, že soubor má změněný datum (funkce vrací 0), ale čas je chybný. To znamená, že soubor nemá ani aktuální čas, ani čas původního, kopírovaného souboru. Ten čas je prostě náhodný (ale né nesmyslný). Setkal se někdo s něčím podobným?

... nenapadá někoho spolehlivější funkce jak zjistit aktuální čas?

Děkuji.
« Poslední změna: 04-12-2017, 15:37:52 od age.new »

Offline zdenek

  • Plnoletý
  • ***
  • Příspěvků: 121
  • Karma: 8
Re:Funkce Now nevrací správný čas.
« Odpověď #1 kdy: 04-12-2017, 17:15:32 »
To by mohlo ovlivnit třeba nastavení FPU. Jen rychlý nápad. Předpokládám, že v GetLocalTime ve windows asi problém nebude.

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 285
  • Karma: 17
    • Verze Delphi: 10.2
Re:Funkce Now nevrací správný čas.
« Odpověď #2 kdy: 04-12-2017, 18:56:03 »
Pro zápis časových značek raději používám 'now' přímo na databázovém serveru, protože čas na stanicích může být dost mimo (na serveru se nám to nestává). Na serveru to navíc jde automaticky plnit v nějakém triggeru before insert, before update apod. a člověk na to nemusí myslet na x místech aplikace.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1866
  • Karma: 91
    • Verze Delphi: D2007, XE3, DX10
Re:Funkce Now nevrací správný čas.
« Odpověď #3 kdy: 04-12-2017, 19:09:52 »
Pro zápis časových značek raději používám 'now' přímo na databázovém serveru
Ja to tak vetsinou taky delavam, ale treba ted mam singleton, ktery spravuje cas v aplikaci, takze vsude se bere AppTime.Now. Tim jsem schopen zadat na cmdline cas, pro zpracovani dat notBefore ev. notAfter a spustit to a treba ladit chybu, ke ktere doslo pred 2 dny, jako kdybych byl v realnem case. Kdyz na cmdline nic nezadam, tak to bere aktualni cas.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 568
  • Karma: 23
Re:Funkce Now nevrací správný čas.
« Odpověď #4 kdy: 04-12-2017, 19:38:33 »
... nenapadá někoho spolehlivější funkce jak zjistit aktuální čas?
Děkuji.

Že by byla chyba v tomhle mi přijde celkem nepravděpodobné, spíš bude blbě něco jiného, třeba nesynchronizovaný přístup ke společným proměnným atd. Zkusil bych logování do souboru a psát si tam, jaký je aktuálně čas a jaký je čas souboru atd. Pak se dá zpětně dohledávat, kdy se soubor vyrobil s jakými parametry.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1780
  • Karma: 72
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Funkce Now nevrací správný čas.
« Odpověď #5 kdy: 04-12-2017, 20:15:48 »
Upřímně moc nevěřím, že Now má chybu. Díval jsem se na implementaci v Delphi 5, XE a Tokio a všude je stejná. Pochybuji, že by během 20 let na tu chybu někdo nenarazil.

Spíše si myslím, že někdo do toho souboru zapíše, nebo ho nějak zavřeš později, nebo je zamknutý někým jiným.

Měl jsem podobný problém, a nakonec z toho vylezto, že inkriminovaný log byl v adresaáři, na který dával pozor dropbox nebo googledrive a způsobovalo problém.
Embarcadero MVP - Czech republic

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 103
  • Karma: 0
Re:Funkce Now nevrací správný čas.
« Odpověď #6 kdy: 05-12-2017, 07:15:28 »
Děkuji za rady. Na Now máme postavený celý logovací systém a nepamatuji se, že bych narazil na špatný časový zápis. Kódem pro změnu času souboru to prochází vždy (zjištěno přes debug režim) a funkce FileSetDate vrátí 0, takže soubor by neměl být "uzamčený". Databázi máme v embeded režimu přímo na stanici, tj. bez serveru. Ještě to budu testovat... 

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 103
  • Karma: 0
Re:Funkce Now nevrací správný čas.
« Odpověď #7 kdy: 05-12-2017, 08:59:11 »
Tak problém s datem u souboru vyřešený. V jednom případě se soubor přepisoval jiným (jakousi pracovní zálohou) a tím došlo k vytvoření chybného času. Původně hlavní problém s ukládání času do databáze mi v tomto případě zaslepil oči. Doufám, že řešení bude opět nějaká hloupá chyba. Hodnoty do databáze ukládám jako jednoduchý SQL příkaz s type double (TDateTime).   

Offline martinnr

  • Plnoletý
  • ***
  • Příspěvků: 137
  • Karma: 2
    • Verze Delphi: 7,2009,XE7
Re:Funkce Now nevrací správný čas.
« Odpověď #8 kdy: 06-12-2017, 09:59:02 »
tu by som ešte pripomenul možný nesúlad pri zápise časových značiek, pokiaľ budú na nejaký server prichádzať informácie z viacerých staníc. resp. stačí že z dvoch. pokiaľ záleží na "každej milisekunde", tak v žiadnom prípade sa nespoliehať na to, že by zápisy sedeli v časovom slede.
mám na mysli situáciu, keď niečo do logu pošle jeden počítač a pošle svoju časovú značku a potom niečo pošle iný počítač, alebo sám server niečo zapíše.
rozdiel v nastavenom čase na dvoch počítačoch býva často extrémny (samozrejme pre isté situácie, niekedy na tom nemusí záležať).
len aby sa na to myslelo...

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: