OSDev.org https://forum.osdev.org/ |
|
Calculate Epoch (UNIX) time https://forum.osdev.org/viewtopic.php?f=1&t=33510 |
Page 1 of 1 |
Author: | deleted8917 [ Fri Feb 15, 2019 8:15 pm ] |
Post subject: | Calculate Epoch (UNIX) time |
Well, as the title says, I want to calculate the epoch (UNIX time). As you all know, (or so I believe) epoch time is the seconds since 1/1/1970. It's easy to do, just multiply 31557600 (the number of seconds a year has) by the years between 1970 and the current year is that you're reading this. (in this case 2019). I writted the algorithm in Python, and it works. Now I port it to C, reading the year from CMOS, well you know. Code: void epocht(void) { /* Hardcoded, 'cause CMOS does not have an standard register to century... Anyways, I'll be dead when this century ends. */ int century = 20; uint8_t year = get_rtcdate(9); int fnyr; /* Concatenates century and year in one integer */ fnyr = intcat(century, year); println(nl"Year: "); println(itoa(fnyr, buf, 10)); //fnyr = atoi(buf); /* 1 year = 31557600 seconds */ int yrsec = 31557600; /* Epoch time starts at 1/1/1970 (DD/MM/YYYY) How many years since 1970 and the actual year? */ int yrtn = 1970 - fnyr; char buf9[255]; unsigned int i = 0; while (i <= abs(yrtn)) { /* Formula 31557600 * years since 1970 */ yrsec *= i; ++i; } println(nl"Epoch time: "); println(itoa(yrsec, buf9, 10)); } This code is supposed to give the epoch time between 1/1/1970 and 1/1/actualyear. It just calculate the first day and month of an year, but later I fix that. Well, the problem is that prints nothing, and another problem is that uint8_t year = get_rtcdate(9); returns 25, instead of the actual year. It is weird because it was working before, I don't know what happened. Thanks. |
Author: | bzt [ Fri Feb 15, 2019 11:10 pm ] |
Post subject: | Re: Calculate Epoch (UNIX) time |
The CMOS can store the date in binary and BCD formats too (hint: 25 = 0x19). And what about leap years and leap seconds? And months, days, timezones? Hmm? It takes a bit more than multipling by a precalculated seconds per year. Cheers, bzt |
Author: | Korona [ Sat Feb 16, 2019 1:16 am ] |
Post subject: | Re: Calculate Epoch (UNIX) time |
I do not really understand the point of your while loop. Can't you just multiply the number of seconds per year with the number of years since 1970? As for coding style, i would recommend to write x*100+y instead of having an intcat() function . As bzt said, it seems likely that you ran into BCD encoding. UNIX timestamps usually do not take leap seconds into account, i.e., if you call a function like clock_gettime(CLOCK_REALTIME) and friends, you get a value that differs from the actual number of seconds since 01/01/1970 by the number of leap seconds since then. The tradeoff here is that it is much easier to convert the resulting number to a human-readable form (by static computations). On the other hand, the existence of leap seconds is essentially determined by a consortium based on observation of the earth's trajectory. On UNIX, the timestamps of leap seconds are usually stored in TZinfo files, i.e., those pointed to by /etc/localtime (although, they are not needed to convert UNIX time to local time). Of course, the UNIX timestamps (as returned by clock_gettime() and friends) do take leap years and differences in the number of days per month into account. |
Author: | fpissarra [ Sat Feb 16, 2019 9:34 am ] |
Post subject: | Re: Calculate Epoch (UNIX) time |
It is a little bit more complex than this. Take a look at time/mktime.c in glibc source code. |
Author: | deleted8917 [ Sat Feb 16, 2019 10:20 am ] |
Post subject: | Re: Calculate Epoch (UNIX) time |
fpissarra wrote: It is a little bit more complex than this. Take a look at time/mktime.c in glibc source code. Oh, I see. Better I port the GCC C standard library. |
Page 1 of 1 | All times are UTC - 6 hours |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |