Article View: pl.comp.lang.c
Article #309231Re: time() - ktoś z tym się spotkał
From: bartekltg
Date: Mon, 27 Mar 2017 13:56
Date: Mon, 27 Mar 2017 13:56
259 lines
9775 bytes
9775 bytes
On 27.03.2017 13:51, Piotr Gałka wrote:
> W dniu 2017-03-24 o 20:01, bartekltg pisze:
>>>
>>> Przeglądając tamten mój graf widzę jeszcze:
>>> - między zegarem a struct date funkcję getdate().
>>> - między zegarem a struct time funkcję gettime().
>>
>> Skad są te dwie ostatnie funkcje?
>
> <dos.h>
>
>>> - między tymi dwiema strukturami a long funkcję dostounix().
>
> ta też tam.
>
>> Ja to zrozumiałęm tak, że
>> time()
>> trzyma czas w jakiej swoim ulubionym formacie, nieznanym w ogolności
>> dla piszącego. Możę to być unixtime, może być to filetime.
>> time_t można przerobić na coś czytelnego funbkcjami
>> gmtime i localtime. One są już odpowiednio w UTC i czasie lokalnym.
>
> Ten opis time() który wcześniej zacytowałeś jest sprzeczny z tym, który
> ja znam (z helpa Buildera 5):
> "time gives the current time, in seconds, elapsed since 00:00:00 GMT,
> January 1, 1970, and stores that value in the location pointed to by
> timet, provided that timer is not a NULL pointer."
Gdzie tu widzisz sprzeczność.
Opis ogolny mowi, żę jest to zalezne od implementacji, i jako
ciekawostke podaje, że czesto jest to unix time.
Dokumentacja Buildera 5 dla tego a tego systemu podaje, że
jest to zamiplementowane _w builderze 5_ tak a tak.
Skoro inna wersja buildera działała inaczej, to pewnie w dokumentacji
do odpowiedniej wersji programu jest też to napisane.
Albo mają w dokumentacji błąd ;-)
> Dlatego zdziwiłem się, że coś, co dla mnie chyba gdzieś od lat 80-tych
> było oczywiste nagle mi nie działa.
Od 95 windows używa innego zapisu czasu. Dos (czyli też np windows 3.11)
używał jeszcze innego.
Nie ma w tym nic oczywistego ;-)
> Używam tylko dwóch kompilatorów Buildera-5 - ma bardzo dobry help -
> zawsze trafia w to czego szukam (z wyjątkiem strumieni).
> Buildera 2010 - prawie nic w helpie nie idzie znaleźć - mi chodzi o
Pewnie uznbali, że ludize i tak korzystają z ulubionej wersji
dokumentacji _języka_ online. A, że wiekszość kompilatorów
implementuje diś standard, nie własną wersję, to mogli uznać,
że szkoda pracy ludzi na dołaczanie opisu języka.
Dokumentacja do VCL i innych ich bibliotek na stronie jest.
Jeśli brakuje Ci dokumentacji do standardowej cześći, pisz im,
płacącego klienta (jeśli będize ich dużo) mogą posłuchać;-)
> jakąś funkcję, a on (chyba nie znajdując) otwiera mi help na temat
> używania Edytora.
> Dlatego opieram się na tym co znajduję w Builderze-5.
Ale pewne rzeczy opisane w tej dokumentacji dotyczą implementacji
w B5, a ogolnie są dowolne. I teraz Builder 10 na windowsie
użyje filetime. (a na linuxie pewnie unixtime ;-))
Dokumentacja dla wersji sprzed 5 lat wcześniej nie jest dla nich
wiążąca.
Choć to koszmarny zwyczaj! Jakby dali od poczatku 'zależy od
implementacji' to wiadomo by było, że trzeba pisać tak, aby nie
korzystać z wiedzy, w jakim formacie jest time_t.
A tak obiecali unixtime, a potem zmienili i popsuli stary kod wielu
ludziom ;-]
BTW, od 2005 nie tylko w C++, ale i w C pojawiło się trochę nowych
przydatnych rzeczy.
>>> Ciekawe, czy bez względu na to ta ścieżka prowadzi do czasu Greenwich.
>>> Tylko nie podoba mi się wybieranie czasu dwiema funkcjami bo trzeba by
>>> się zabezpieczyć na wypadek jedno przed, a drugie po zmianie daty (nie
>>> napisałem po północy bo kto wie kiedy ta północ).
>>
>> ?
> Jak jedno pobiorę z zegara przed zmianą doby, a drugie po to będę miał
> błąd o dobę,
A, OK, myślałem, żę getdate() i gettime() dekodują czas ze zmiennej,
a one go odczytują z zegara.
Zgoda, bzdurne funkcje, nie używaj ich.
>> a co jest złego w styrukturze tm? Ona ma wszystko, godzine, date,
>> dzień tygodnia, dzień roku...
>>
> A do czego miała by się przydać.
?
Do tego samego, do czego para
getdate() i gettime().
Aby dostać godzinę i datę ;-)
I to tym razem dostajesz bez wymeinionyhc wcześneij problemów.
> difftime potrzebuje time_t.
> Nie ma sensu zamieniać time_t na tm i z powrotem na time_t.
A po co miałbyś to robić?
Chciałeś zmierzyć czas w sekundach pomiędzy dwoma momentami.
difftime jest do tego odpowiednią standardową funkcją.
>> z difftime bedzie dzialać jak oczekujesz, tylko aby wszystko domknac,
>> trzeba by umiec generować time_t dla chwili, który uznajesz
>> za umowny poczatek. I nie wiem czym, bo mktime konwerteuje godzinodatę
>> uznajac, ze jest ona w czasie lokalnym.
>
> I tu mi wychodzi, że tm nic nie daje.
Bo?
W sumie nigdy nie powqiedziałeś, co tak naprawdę chcesz osiagnać.
>> BTW, tu lista co siedzi na pewno w time.h
>> http://en.cppreference.com/w/c/chrono
>
> Jak wszedłem w time to w przykładzie zakładają, ze time_t custed do
> uintmax_t daje czas w sekundach od Epoch czyli jak rozumiem GMT.
Nie.
Przeczytaj raz jeszcze.
#include <stdio.h>
#include <time.h>
#include <stdint.h>
int main(void)
{
time_t result = time(NULL);
if(result != -1)
printf("The current time is %s(%ju seconds since the Epoch)\n",
asctime(gmtime(&result)), (uintmax_t)result);
}
Possible output:
The current time is Fri Apr 24 15:05:25 2015
(1429887925 seconds since the Epoch)
Gdzie tu jest założenie o formacie time_t poza tym, zę jest on
w sekundach?
Wypluta liczba 1429887925 zależy od implementacji, bo epoka
możę być inaczej ustalona.
> time() (pod Builderem 2010) przed zmianą czasu dawało mi błąd o 1h
> względem GMT a teraz daje mi dobry czas.
Może miałeś zegar źle skonfigurowany? ;-)
BTW, time_t to nie czas. To liczba sekund od chwili
takiej a takiej tego a tego dnia w takiej a takeij strefie.
Przeliczałeś to poprawnie? Inną liczbę godzin trzeba przesunac
zimą i latem.
> Cast (uintmax_t) z wartości odczytanej time() działa tak samo - czyli
> dziś dobrze, ale w zimie źle (cofnąłem zegar komputera).
Ale Ty nie masz cofnąć zegara. Masz kliknąć 'czas letni/zimowy',
bo to NIE jest to samo co cofnać zegar.
> Natomiast GetSystemTimeAsFileTime() działa mi dobrze i teraz i w zimie.
>> i tam jest
>> http://en.cppreference.com/w/c/chrono/timespec_get
>> i przynajmniej wyciąfać czasy z roznych stref jest ciut wygodniej.
>>
>
> Tam jest taki fragment:
> ------------
> If base is TIME_UTC, then
> ts->tv_sec is set to the number of seconds since an implementation
> defined epoch,
> ------------
>
> Mi to sugeruje, że nawet jak bazę wpiszę na TIME_UTC to dostanę coś
> implementation defined.
Tak.
Pomyśl w ten sposób, co Cię obchoedzi epoka? Co za różnica dla pisacego,
czy liczą sekundy od 1601, 1970, 1980 czy 1900?
Obchodzi Cię transformacja time_t <-> data/godzina, która też jest
odpowiednio zdefiniowana,
i różnica pomiędzy dwoma time_t (bo wtedy epoka się skasuje... ale i tak
lepiej użyć difftime).
>> http://en.cppreference.com/w/cpp/chrono/time_point
>> Na zachętę:
>> http://en.cppreference.com/w/cpp/chrono/time_point/time_since_epoch
>>
>> Ale zawartość chrono zawsze wywoluje u mnie mętlik w głowie.
>
> Nie jestem na bieżąco z nowinkami - to co pokazujesz jest od C11, a ja
> używam narzędzi sprzed C11.
Po co sobie życie utrudniać?
;-)
> Wydaje mi się, że tak jak było opisane w Builderze 5 - czyli time() daje
> czas GMT było dobrze.
Ale w windowsie system nie daje posixowego czasu. Daje windowsowy.
Można to przeliczać w time(.), ale po co mieliby to robić?
> Jedynie można było zmienić time_t z long na unsigned long, albo unsigned
> long long.
Nie powinno Cię obchodzić, jakiego typu jest time_t.
CHyba nawet nie jest powiedziane, zę ma być to typ całkowity ;-)
> Mam wrażenie, że coś prostego zostało skutecznie zagmatwane.
> Aż dziwne, że aby uzyskać GMT (w sekundach) to trzeba przechodzić przez
> jakieś struktury.
Nie ma czegoś takiego jak GMT w sekundach.
GTM w sekundach od określonej chwili czasu, generowany
przenośnie, nie jest takim oczywistym i każdemu potrzebnym
narzędziem ;-)
A i wtedy, są to trzy-czytery linijki.
>> OK, jest to wzytko logiczne i przydatne, ale jest tego za dużo
>> jak na uwagę, jaką zwykle do tego przywiązuuyję ;-)
>>
> Jeszcze nigdy nie przyglądałem się zawartości chrono. Jak zacznę używać
> czegoś C11 to się (może) przyjrzę.
Chrono jest w c++11. Czy jest jakiś odpowiendik w C11, głęboko wątpię.
pzdr
bartekltg
Technical Details
Message-ID:
<obb5m5$h7r$1@node2.news.atman.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mailReferences:
<ob306i$n9s$1@news.chmurka.net> <ob32qf$ogn$1@node2.news.atman.pl> <ob380f$qa0$1@news.chmurka.net> <sTdc5vk8I9c8Nv8%gof@news.chmurka.net> <tTdc5vmcI9c8Nv8%gof@news.chmurka.net> <ob3cld$sef$1@news.chmurka.net> <ob3qdc$fq9$1@node2.news.atman.pl> <obaub6$me5$1@news.chmurka.net>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mail From: bartekltg <bartekltg@gmail.com> Newsgroups: pl.comp.lang.c Subject: Re: time() - ktoś z tym się spotkał Date: Mon, 27 Mar 2017 15:56:20 +0200 Organization: ATMAN - ATM S.A. Lines: 261 Message-ID: <obb5m5$h7r$1@node2.news.atman.pl> References: <ob306i$n9s$1@news.chmurka.net> <ob32qf$ogn$1@node2.news.atman.pl> <ob380f$qa0$1@news.chmurka.net> <sTdc5vk8I9c8Nv8%gof@news.chmurka.net> <tTdc5vmcI9c8Nv8%gof@news.chmurka.net> <ob3cld$sef$1@news.chmurka.net> <ob3qdc$fq9$1@node2.news.atman.pl> <obaub6$me5$1@news.chmurka.net> NNTP-Posting-Host: 89-70-119-159.dynamic.chello.pl Mime-Version: 1.0 X-Trace: node2.news.atman.pl 1490622981 17659 89.70.119.159 (27 Mar 2017 13:56:21 GMT) X-Complaints-To: usenet@atman.pl NNTP-Posting-Date: Mon, 27 Mar 2017 13:56:21 +0000 (UTC) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 In-Reply-To: <obaub6$me5$1@news.chmurka.net> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit