Godzina duchów i funkcja DateTimeToStr(Now)

0

Coś dziwnego dzieje się z funkcją DateTimeToStr(Now) kiedy wybija godzina 0000
Funkcja wyświetla w tej właśnie sekundzie jedynie datę pole czasu pozostaje puste... kolejna sekunda
i mamy już poprawnie 0001

Jednak konwersja powoduje błędne wpisy do bazy danych bo wstawia jedynie datę nie czas.
Jak temu zaradzić?

0
tester_68k napisał(a)

Coś dziwnego dzieje się z funkcją DateTimeToStr(Now) kiedy wybija godzina 0000
Funkcja wyświetla w tej właśnie sekundzie jedynie datę pole czasu pozostaje puste... kolejna sekunda
i mamy już poprawnie 0001

Jednak konwersja powoduje błędne wpisy do bazy danych bo wstawia jedynie datę nie czas.
Jak temu zaradzić?

Sądzę że nieprawidłowo wpisujesz do bazy danych czas jako łańcuch. Do tego służy typ danych timestamp i typ pola w delphi jest AsSQLTimeStamp. Później możesz utworzyć indeks na polu tej daty i to przyspieszy wyszukiwanie jeśli pole daty będzie w klauzuli where zapytania SQL. Poza tym bezpieczniej jest używac daty systemowej zamiast now (czas lokalny) ze względu na cofanie czasu lokalnego o godzinę raz w roku. Data systemowa to GMT (universal time) i się nie przesuwa. Potrzebne funkcje to getsystemtime, systemtimetodatatime, datatimetosqltimestamp.

0

Wrrr.... wybaczcie za off top ale godziną duchów, demonów etc jest godzina 3:00 a nie 0:00!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

0
tester_68k napisał(a)

Jednak konwersja powoduje błędne wpisy do bazy danych bo wstawia jedynie datę nie czas.
Jak temu zaradzić?
używać w bazie ODPOWIEDNICH typów pól

0

Nie chodzi mi o pobieranie czasu systemowego zastosowałem Now() tylko jako przykład
Chce połączyć TDate i TTime w zmienną typu TDateTime jest z tym jednak problem
prawdopodobnie w samym delphi....

Wyjaśnie precyzyjniej:

Mam datę w postaci zmiennej TDate;

oraz czas w postaci wartości string = '0000'

aby obie te zmienne połączyć w potrzebną mi zmienną typu TDateTime

napisałem funkcję:

uses DateUtils;

function KonwersjaCzasu(Data: TDate; Czas: TTime): TDateTime;
var
Year,Month,Day,Hour,Min,Sec,MSec: word;
begin
try
DecodeDate(Data,Year,Month,Day);
DecodeTime(Czas,Hour,Min,Sec,MSec);
Result:=EncodeDateTime(Year,Month,Day,Hour,Min,Sec,MSec);
except
Result:=0;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Caption:=DateTimeToStr(KonwersjaCzasu(Now,StrToTime('0000')));
end;

jednak kiedy wywołamy coś takiego reakcja Delphi jest bardzo dziwaczna....
oczywiście cały problem dotyczy tylko godziny 0000

dlaczego o 0000 dostajemy tylko datę bez godzin???????

0
  1. jak będziesz miał pole w bazie odpowiednie to nie będzie to miało znaczenia
  2. dodawanie daty i godziny to Trunc(Data) + Frac(Godzina)
  3. jak Ci nie odpowiada DateTimeToStr to sobie weź FormatDateTime('YYYY-mm-dd HHss', Now);
0
Misiekd napisał(a)
  1. jak będziesz miał pole w bazie odpowiednie to nie będzie to miało znaczenia
  2. dodawanie daty i godziny to Trunc(Data) + Frac(Godzina)
  3. jak Ci nie odpowiada DateTimeToStr to sobie weź FormatDateTime('YYYY-mm-dd HHss', Now);

Spróbuj zmienić typ funkcji KonfersjaCzasu na String
i zamiast
Result:=EncodeDateTime(Year,Month,Day,Hour,Min,Sec,MSec);
daj
Result:=IntTostr(Year)+'.'+IntTostr(Month)+'.'+IntTostr(Day)+' '+IntTostr(Hour)+':'+IntTostr(Min)+i tak dalej

Zobacz czy to pomaga. Być może jest za dużo tych konwersji w twoim kodzie i to powoduje pojawianie się błędu w bibliotekach producenta.

0

witam,
1.
wydaje mi się, że @tester_68k ma rację, ponieważ konwertując (w D7) DateTimeToStr(0) wyświetla TYLKO 31-12-1899 bez czasu 0000, w D5 trza dodać stringi DateToStr i TimeToStr :)
dlatego przychylam się do poprzednika, żeby zastosować Encode i zamienić na stringi
2. myślę, że @tester_68k "biega" właśnie o 1. a scricte o zapis pól do bazy

edit: stringi to znaczy łańcuchy, żeby sobie ktoś czegoś innego nie pomyślał :d

0

@Mariusz Jędrzejowski możesz powiedzieć po co kogoś cytujesz jak w ogóle nie odnosisz się do cytowanej wypowiedzi?

0
Gladiatus napisał(a)

Wrrr.... wybaczcie za off top ale godziną duchów, demonów etc jest godzina 3:00 a nie 0:00!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

O północy budzą się duchy, o 3:00 budzą się demony.

0

Zobacz czy to pomaga. Być może jest za dużo tych konwersji w twoim kodzie i to powoduje pojawianie się błędu w bibliotekach producenta.</quote>

Faktycznie jest błąd ale nie w moim kodzie to procedura z Delphi działa
źle mowa tu o DateTimeToStr()

Proszę przetestować taki kod:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Caption:=DateTimeToStr(Now);
end;

Przed jego odpaleniem proszę ustawić zegar systemowy na godzinę 23:59
i obserowować co się pojawi kiedy czas powinien pokazać 0000
powinien ale wtedy dzieje się coś dziwnego

Tyle lat stosowania Delphi i nikt tego nie wykrył ........!!!!!!!!!!! ?????? [!!!] [???]

1 użytkowników online, w tym zalogowanych: 0, gości: 1