🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #309231

Re: time() - ktoś z tym się spotkał

#309231
From: bartekltg
Date: Mon, 27 Mar 2017 13:56
259 lines
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-mail
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>

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