CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Data i czas

Data i czas

dział ogólny

Data i czas

Nowy postprzez Manianass » środa, 11 listopada 2015, 01:11

Witam.
chce napisać program który wczyta datę z pliku i datę systemową i wyświetli ile czasu upłynęło z dokładnością co do sekundy.Wynik może być tez w mili sekundach.
Czyli
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TIniFile *Ini = new TIniFile("Ustawienia1.ini");

 Ini->WriteString("SEKCJA1", "ZawartoscLabel1", Label1->Caption);                   // zapisywanie wartości liczbowej do sekcji [SEKCJA1].
 Ini->WriteString("SEKCJA1", "ZawartoscLabel2", Label2->Caption);  
 delete Ini;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 TIniFile *Ini = new TIniFile("Ustawienia1.ini");

 Label3->Caption = Ini->ReadString("SEKCJA1", "ZawartoscLabel1", "tekst domyślny");          // odczytywanie wartości liczbowej z sekcji [SEKCJA1].
Label4->Caption = Ini->ReadString("SEKCJA1", "ZawartoscLabel2", "tekst domyślny");
 delete Ini;
}
 


I to ładnie działa tylko teraz jak to odjąć żeby wyszedł dobry wynik czy jest jakaś funkcja czy trzeba rozbić na czynniki pierwsze i odejmować ??
Avatar użytkownika
Manianass
Bladawiec
Bladawiec
 
Posty: 27
Dołączył(a): środa, 11 listopada 2015, 00:45
Lokalizacja: Lubin
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Builder C++
Gadu Gadu: 0
    Windows 7Firefox

Re: Data i czas

Nowy postprzez polymorphism » czwartek, 12 listopada 2015, 10:29

Szczerze mówiąc nie wiadomo, co od czego odejmować. Nie napisałeś, w jakim formacie chcesz/masz zapisana datę w pliku, więc trudno coś konkretnego napisać.

Jeśli chodzi funkcje, to masz w C bibliotekę time.h, w C++ std::chrono.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    LinuxChrome

Re: Data i czas

Nowy postprzez Mironas » czwartek, 12 listopada 2015, 10:41

Zakładam że wiesz, że tekst wpisany do Label3->Caption trzeba najpierw zamienić np. na TDateTime - aby można było cokolwiek z niego wyliczyć. Tak samo datę systemową musisz wczytać do takiego samego typu.

W pliku nagłówkowym (Unit1.h) musisz dodać:
KOD cpp:     UKRYJ  
#include <DateUtils.hpp>

Różnicę w milisekundach pomiędzy dwoma "data-czasami" zwróci funkcja MilliSecondsBetween(...).
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Data i czas

Nowy postprzez Cyfrowy Baron » czwartek, 12 listopada 2015, 12:42

Rozwijając wywód Mironas's:

KOD cpp:     UKRYJ  
#include <DateUtils.hpp>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TDateTime data1 = TDateTime::CurrentDateTime(); // aktualny

 TDateTime data2;

 data2 = EncodeDateTime( 2015, 11, 3, 7, 20, 10, 0 ); /* rok, miesiąc, dzień, godzina, minuta, sekunda, milisekunda */

 int y = YearsBetween(data1, data2);
 int M = MonthsBetween(data1, data2);
 int d = DaysBetween(data1, data2);

 int h = HoursBetween(data1, data2);
 int m = MinutesBetween(data1, data2);
 int s = SecondsBetween(data1, data2);

 Edit1->Text = (String)d + " dni, " + (String)h + " godz., " + (String)m + " min., " + (String)s + " sec.";
}
//---------------------------------------------------------------------------



W ten sposób otrzymasz oczywiście różnice pomiędzy datami w dniach, godzinach, minutach, ale bez uwzględniania różnic np. pomiędzy dniem i godziną, czyli np 8 dni, ale też 208 godz - tylko, że te 208 godz. to jest też 8 dni 16 godz. Musisz więc jeszcze stworzyć algorytm, który wyliczy różnice, np. coś takiego:

KOD cpp:     UKRYJ  
 int dh_diff = h - d*24; /* różnica między dniami i godzinami */


Nie będę ci pisał wyliczania różnic pomiędzy wszystkimi składnikami, bo z pewnością teraz sobie z tym poradzisz.

Nie napisałeś, jakiej wersji środowiska używasz, a w profilu też tego nie ma, więc może się zdarzyć, że w starszych wersjach środowiska C++Builder nie ma w bibliotece DateUtils funkcji ...Between.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Manianass
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Data i czas

Nowy postprzez Manianass » czwartek, 12 listopada 2015, 14:26

Jak to czytam teraz sam za pomocą smartfona to widzę że nic ciekawego nie zamieściłem.
A więc korzystam z Builder 6 c++.
a godzinę pobieramy tak

KOD cpp:     UKRYJ  
TDateTime Teraz = TDateTime::CurrentDate();
   Label1->Caption = Teraz.FormatString("dd-mm-yyyy");



przepraszam że wkleiłem tak tekst, jak przyjadę do domu to ładnie prze edytuje post.
Avatar użytkownika
Manianass
Bladawiec
Bladawiec
 
Posty: 27
Dołączył(a): środa, 11 listopada 2015, 00:45
Lokalizacja: Lubin
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Builder C++
Gadu Gadu: 0
    NieznanyOpera

Re: Data i czas

Nowy postprzez Cyfrowy Baron » czwartek, 12 listopada 2015, 17:55

To jak pobierasz to twoja sprawa. Jednak by dokonać jakichkolwiek zmian na poszczególnych składnikach będziesz musiał je dostosować do kodu który podałem.

W podanym przez ciebie kodzie aktualna data jest wyświetlana w komponencie typu TLabel, ale to akurat nikomu do niczego się nie przyda. Bardziej istotne jest to jak pobierasz drugą datę, którą chcesz odjąć od aktualnej. Jeżeli masz ją zapisaną w formacie systemowym to da się to przepisać to TDateTime. Musisz jednak mieć na uwadze, że sposób interpretacji daty może być różny na różnych systemach - zależy jak użytkownik sobie ją ustawi. Tak więc tą drugą datę musisz enkodować, tak jak to podałem w swoim przykładzie, by uniknąć niezgodności programu działającego w różnych systemach.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Data i czas

Nowy postprzez Manianass » czwartek, 12 listopada 2015, 23:01

Ja przerobiłem to tak i działa. Pokazuje same zera czyli ok. Może jest lepszy sposób ale ja go nie znam a to działa tak jak che i mi to wystarczy.

Dziekuje wszystkim za pomoc !!

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{

 TDateTime data1 = TDateTime::CurrentDateTime(); // aktualny
 TDateTime data2;

 //---------------------------------------------------------------------------
    TDateTime today = TDateTime::CurrentDate();
    int dzi = StrToInt(today.FormatString("d"));
    int mie = StrToInt(today.FormatString("m"));
    int rok = StrToInt(today.FormatString("yyyy"));
    TDateTime now = TDateTime::CurrentTime ();
    int godz = StrToInt(now.FormatString("h"));
    int minu = StrToInt(now.FormatString("n"));
    int seku = StrToInt(now.FormatString("s"));
 //---------------------------------------------------------------------------
 data2 = EncodeDateTime( rok, mie, dzi, godz, minu, seku, 0 );
 int d = DaysBetween(data1, data2);
 int h = HoursBetween(data1, data2);
 int m = MinutesBetween(data1, data2);
 int s = SecondsBetween(data1, data2);

 Edit1->Text = (String)d + " dni, " + (String)h + " godz., " + (String)m + " min., " + (String)s + " sec.";

}
 
Avatar użytkownika
Manianass
Bladawiec
Bladawiec
 
Posty: 27
Dołączył(a): środa, 11 listopada 2015, 00:45
Lokalizacja: Lubin
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Builder C++
Gadu Gadu: 0
    Windows 7Firefox

Re: Data i czas

Nowy postprzez Mironas » piątek, 13 listopada 2015, 12:29

To samo tylko trochę prościej:
KOD cpp:     UKRYJ  
#include <DateUtils.hpp>

void __fastcall TForm1::Button3Click(TObject *Sender)
{
  TDateTime data1 = Now(); // aktualny
  TDateTime data2;

  TDateTime today = Date();
  int dzi = DayOf(today);
  int mie = MonthOf(today);
  int rok = YearOf(today);
  TDateTime now = Time();
  int godz = HourOf(now);
  int minu = MinuteOf(now);
  int seku = SecondOf(now);

  data2 = EncodeDateTime( rok, mie, dzi, godz, minu, seku, 0 );
  int d = DaysBetween(data1, data2);
  int h = HoursBetween(data1, data2);
  int m = MinutesBetween(data1, data2);
  int s = SecondsBetween(data1, data2);

  String tekst;
  tekst.printf(L"%d dni, %d godz., %d min., %d sec.", d, h, m, s);    // wersja dla Builder XE
  //tekst.sprintf("%d dni, %d godz., %d min., %d sec.", d, h, m, s);    // wersja dla Builder 6 (chyba - nie sprawdzałem)
  Edit1->Text = tekst;
}
//---------------------------------------------------------------------------
 
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Data i czas

Nowy postprzez Manianass » piątek, 13 listopada 2015, 13:51

Zawsze jest kilka wyjść chciałem sam coś pomyśleć niz tylko czekac na gitiwce

jeszcze raz dziękuje za pomoc .
Avatar użytkownika
Manianass
Bladawiec
Bladawiec
 
Posty: 27
Dołączył(a): środa, 11 listopada 2015, 00:45
Lokalizacja: Lubin
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Builder C++
Gadu Gadu: 0
    LinuxSafari

Re: Data i czas

Nowy postprzez Mironas » piątek, 13 listopada 2015, 15:04

Datę+czas można jednocześnie pobrać w jeszcze prostszy sposób:
KOD cpp:     UKRYJ  
TDateTime DataCzas = Now();
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Data i czas

Nowy postprzez Cyfrowy Baron » piątek, 13 listopada 2015, 15:24

Nie tyle sposób prostszy ile inna funkcja. Now() po prostu robi to samo. To jednak bez większego znaczenia.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Data i czas

Nowy postprzez Cyfrowy Baron » piątek, 13 listopada 2015, 15:25

Co do twojego kodu Manianass to on nie działa prawidłowo, tylko go jeszcze dokładnie nie przetestowałeś i nie widzisz problemu. Gdy odejmujesz aktualną datę i czas od aktualnej daty i czasu, to muszą wyjść same zera, ale co będzie, gdy do data2 wprowadzisz zmienne z pliku INI?

Poza tym zastanawiające są te kombinacje:

KOD cpp:     UKRYJ  
TDateTime today = TDateTime::CurrentDate();

KOD cpp:     UKRYJ  
TDateTime now = TDateTime::CurrentTime ();

Skoro wystarczyłoby tak:

KOD cpp:     UKRYJ  
TDateTime DataCzas = TDateTime::CurrentDataTime ();


do DataCzas zostanie zwrócony zarówno czas i data. Jest to tym bardziej dziwne, że wcześniej dałeś coś takiego:

KOD cpp:     UKRYJ  
 TDateTime data1 = TDateTime::CurrentDateTime(); // aktualny


Czyli wrzuciłeś do data1 zarówno czas jak i datę.

Poza tym, jeżeli porównujesz aktualną datę z datą aktualną, to nie musisz ich enkodować, czyli w takiej formie jak to przedstawiłeś kod jest nadmiernie rozdęty, gdyż wystarczyłoby tak:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{

 TDateTime data1 = TDateTime::CurrentDateTime(); // aktualny
 TDateTime data2 = TDateTime::CurrentDateTime();

 int d = DaysBetween(data1, data2);
 int h = HoursBetween(data1, data2);
 int m = MinutesBetween(data1, data2);
 int s = SecondsBetween(data1, data2);

 Edit1->Text = (String)d + " dni, " + (String)h + " godz., " + (String)m + " min., " + (String)s + " sec.";
}


Efekt działania będzie identyczny z twoim kodem.



Myślę, że ty po prostu nie zrozumiałeś jeszcze jak ten kod działa i jak to się będzie miało do tego co chcesz zaprogramować. Jak znam życie zaraz napisze, że jednak coś nie działa po twojej myśli...


Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Data i czas

Nowy postprzez Manianass » czwartek, 19 listopada 2015, 19:10

Wiem jedno ze nie wiem wszystkiego trochę wiem jak to działa ale nie do końca czasem wywarzam otwarte drzwi jak widać w postach wyżej ale w miarę wychodzi to co chce.

Na pewno jest jakaś funkcja tylko ja nie wiem jaka co dodaje do daty jakiś inną datę znaczy na przykład do aktualnej daty i godziny dodać 2 dni 3 godziny 5 minut i 10 sekund. Jak coś takiego zrealizować. A też fajnie by było jak będzie funkcja która doda do aktualnej godziny i daty na przykład tez 2 dni 3 godziny 5 minut i 10 sekund tylko w sekundach czyli 183910, ale proszę nie przeliczać z dni i godzin na sekundy bo dane dodawane do daty będą właśnie w sekundach a dla użytkownika będzie tylko wyświetlany czas w dniach godzinach ... .
dziękuje z góry za pomoc i za to co już mi pomogliście dzięki.
Avatar użytkownika
Manianass
Bladawiec
Bladawiec
 
Posty: 27
Dołączył(a): środa, 11 listopada 2015, 00:45
Lokalizacja: Lubin
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Builder C++
Gadu Gadu: 0
    Windows 7Firefox

Re: Data i czas

Nowy postprzez Cyfrowy Baron » piątek, 20 listopada 2015, 16:13

Inkrementowanie daty o zadany czas jest banalnie proste. Przykład inkrementacji w sekundach. Dodam 24 godziny do aktualnej daty, ale przeliczone na sekundy:

KOD cpp:     UKRYJ  
#include <DateUtils.hpp>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TDateTime data1 = TDateTime::CurrentDateTime(); // aktualny

 data1 =  IncSecond(data1, 86400); // 86400 = 24 godziny

 Edit1->Text = data1.FormatString("dd-mm-yyyy hh:nn:ss");
}
//---------------------------------------------------------------------------


Do inkrementacji innych składników daty służą odpowiednio funkcje:

IncMonth
IncDay
IncHour
IncMilliSecond
IncMinute
IncWeek
IncYear
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Data i czas

Nowy postprzez Manianass » piątek, 20 listopada 2015, 17:32

I to jest pieką i jasna odpowiedź dziękuję!!
Avatar użytkownika
Manianass
Bladawiec
Bladawiec
 
Posty: 27
Dołączył(a): środa, 11 listopada 2015, 00:45
Lokalizacja: Lubin
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Builder C++
Gadu Gadu: 0
    NieznanyOpera


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 42 gości

cron