problem z time() - strefy czasowe

dział ogólny

problem z time() - strefy czasowe

Nowy postprzez shycat » czwartek, 29 października 2009, 02:27

Witam, chce napisac sobie maly programik, ktory bedzie mi pokazywal jaki jest aktualnie czas w roznych miejscach na swiecie, np w Tokio, no i mam taki kod:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  TDateTime czas=Time();

  Label2->Caption="  Tokio:  "+TimeToStr(czas);
}
//---------------------------------------------------------------------------


Ten kod oczywiscie pokazuje aktualny czas... probowalam zrobic tak: TDateTime czas=Time()+6000; lub czas=czas+6000; ale nie przynosci to zadnego rezultatu... nie rozchodzi mi sie o to, ze w Tokio czas jest +9 h, ale o to, zeby dodac jakas wartosc czasowa, np 1 godzine do czasu aktualnego. Przegladalam google, ale nic nie moglam znalezc, wiec pisze na forum. Pozdrawiam i prosze o pomoc.
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: ÅšlÄ…sk
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    NieznanyNieznana

Re: problem z time() - strefy czasowe

Nowy postprzez Cyfrowy Baron » czwartek, 29 października 2009, 10:12

Nie można ot tak po prostu dodać wartości typu int do wartości typu TDataTime.

ProponujÄ™ takie rozwiÄ…zanie:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TTime czas = Time(); // może też być TDateTime

int godzina = StrToInt(czas.FormatString("hh"));
godzina = godzina + 9;

if(godzina == 24) godzina = 0;
if(godzina > 24) godzina = godzina - 25;

Label1->Caption = "Czas w Tokio: " + FormatCurr("#00", godzina) +  FormatDateTime(":nn:ss", czas);
}
//---------------------------------------------------------------------------
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
    NieznanyNieznana

Re: problem z time() - strefy czasowe

Nowy postprzez Witold » czwartek, 29 października 2009, 10:18

shycat napisał(a):ale o to, zeby dodac jakas wartosc czasowa, np 1 godzine do czasu aktualnego.


Kod: Zaznacz cały
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  TDateTime zaGodzine = Now() + TDateTime(1 /*godz*/, 0,0,0);
  Caption = "Teraz: " + Now().TimeString() + " ,za godzinÄ™: "+ zaGodzine.TimeString();
}
//---------------------------------------------------------------------------

Za ten post autor Witold otrzymał podziękowania - 2:
Cyfrowy Baron, shycat
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: problem z time() - strefy czasowe

Nowy postprzez Cyfrowy Baron » czwartek, 29 października 2009, 11:41

Nie wiedziałem, że tak można.
Mam w związku z tym pytanie, czy można w analogiczny sposób postąpić z dodawaniem daty, np. dodać pięć miesięcy do aktualnej daty?
Próbuję, ale nie działa.
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
    NieznanyNieznana

Re: problem z time() - strefy czasowe

Nowy postprzez Witold » czwartek, 29 października 2009, 12:38

Cyfrowy Baron napisał(a):Mam w związku z tym pytanie, czy można w analogiczny sposób postąpić z dodawaniem daty, np. dodać pięć miesięcy do aktualnej daty?
Próbuję, ale nie działa.


Najwyraźniej nie. Wg helpa 0 dla TDateTime (dane trzymane w typie double) to 12/30/1899 12:00 am, to dla 5m-cy trzeba by dodać TDateTime(1900,6,1) ? – bezsens.

W DateUtils są lepsze funkcje do tego (nawet nie wiedziałem):
IncDay
Returns a date shifted by a specified number of days.

IncHour
Returns a date/time value shifted by a specified number of hours.

IncMilliSecond
Returns a date/time value shifted by a specified number of milliseconds.

IncMinute
Returns a date/time value shifted by a specified number of minutes.

IncSecond
Returns a date/time value shifted by a specified number of seconds.

IncWeek
Returns a date shifted by a specified number of weeks.

IncYear
Returns a date shifted by a specified number of years.

Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: problem z time() - strefy czasowe

Nowy postprzez Cyfrowy Baron » czwartek, 29 października 2009, 12:52

Mi chodzi o sposób na proste inkrementowanie daty. Sposoby jakich się dotychczas imałem wymagają uwzględniania zbyt wielu zmiennych, a prawdziwą "zmorą" jest rok przestępny.
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
    NieznanyNieznana

Re: problem z time() - strefy czasowe

Nowy postprzez shycat » czwartek, 29 października 2009, 13:33

Dzieki wielkie za pomoc :) w zyciu bym na to nie wpadla... musze nauczyc sie korzystac z helpa, eh... ps. lubiecie zime? :D (bo nadchodzi)
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: ÅšlÄ…sk
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    NieznanyNieznana

Re: problem z time() - strefy czasowe

Nowy postprzez Cyfrowy Baron » czwartek, 29 października 2009, 15:17

Najwyraźniej nie. Wg helpa 0 dla TDateTime (dane trzymane w typie double) to 12/30/1899 12:00 am, to dla 5m-cy trzeba by dodać TDateTime(1900,6,1) ? – bezsens.


By zwiększyć datę trzeba uwzględnić właśnie tą datę początkową 12/30/1899:

Zwiększenie o jeden dzień:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TDateTime czas = Now() + TDateTime(1899, 12, 31, 0, 0, 0, 0);

Label1->Caption = czas;
}
//---------------------------------------------------------------------------


a żeby zwiększyć o dwa dni:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TDateTime czas = Now() + TDateTime(1900, 1, 1, 0, 0, 0, 0);

Label1->Caption = czas;
}
//---------------------------------------------------------------------------


Daje to już jakiś punkt zaczepienia umożliwiający inkrementację daty, trzeba tylko dorobić do tego algorytm.
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
    NieznanyNieznana

Re: problem z time() - strefy czasowe

Nowy postprzez Witold » czwartek, 29 października 2009, 16:23

Cyfrowy Baron napisał(a):Zwiększenie o jeden dzień:
...


Można też: IncDay(Now(),1);
lub Now() +1;

Kod: Zaznacz cały
#include <DateUtils.hpp>

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  TDateTime dt1(2008,2,25); // Rok przestÄ™pny
  TDateTime dt2(2009,2,25);

  const int ILE_DNI_DODAC = 4;
  TDateTime dt1_po = IncDay(dt1,ILE_DNI_DODAC);
  TDateTime dt1_po2 = dt1+ILE_DNI_DODAC;

  Memo1->Lines->Add("Przed dt1= " + dt1.DateString());
  Memo1->Lines->Add("Po IncDay= " + dt1_po.DateString());
  Memo1->Lines->Add("Po +int=   " + dt1_po2.DateString());

  TDateTime dt2_po = IncDay(dt2,ILE_DNI_DODAC);
  TDateTime dt2_po2 = dt2+ILE_DNI_DODAC;

  Memo1->Lines->Add("-------------");
  Memo1->Lines->Add("Przed dt2= " + dt2.DateString());
  Memo1->Lines->Add("Po IncDay= " + dt2_po.DateString());
  Memo1->Lines->Add("Po +int=   " + dt2_po2.DateString());

}


wynik:
Przed dt1= 2008-02-25
Po IncDay= 2008-02-29
Po +int= 2008-02-29
-------------
Przed dt2= 2009-02-25
Po IncDay= 2009-03-01
Po +int= 2009-03-01
Ostatnio edytowano piątek, 30 października 2009, 16:00 przez Witold, łącznie edytowano 1 raz
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: problem z time() - strefy czasowe

Nowy postprzez Cyfrowy Baron » czwartek, 29 października 2009, 17:13

To jest oczywiste:

Kod: Zaznacz cały
  TDateTime dt1_po = IncDay(dt1,ILE_DNI_DODAC);


ale to daje mi do myślenia:

Kod: Zaznacz cały
  TDateTime dt1_po2 = dt1 + ILE_DNI_DODAC;


dlaczego inkrementowane sÄ… dni?
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
    NieznanyNieznana

Re: problem z time() - strefy czasowe

Nowy postprzez Witold » czwartek, 29 października 2009, 17:49

Cyfrowy Baron napisał(a):dlaczego inkrementowane są dni?

help bcb6 napisał(a):The TDateTime class inherits a val data member declared as a double that holds the date-time value. The integral part of a TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of a TDateTime value is the time of day.


Zresztą i tak chyba lepiej jest używać IncDay, bardziej czytelnie i jak zmieni się reprezentacja wewnętrzna TDateTime, to dalej powinno działać.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: problem z time() - strefy czasowe

Nowy postprzez Cyfrowy Baron » czwartek, 29 października 2009, 19:55

Zresztą i tak chyba lepiej jest używać IncDay, bardziej czytelnie i jak zmieni się reprezentacja wewnętrzna TDateTime, to dalej powinno działać.


Raczej tak.

Trochę cieszyłem się na myśl, ze opracuję własny algorytm inkrementujący datę, ale skoro są już gotowe funkcje to już mi się nie chce...
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
    NieznanyNieznana


  • 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 5 gości