1
0
Fork 0
elinks/src/protocol
Guido Cella 0d8d834af3 [rewrite] Update prefixes 2020-07-05 05:58:25 +02:00
..
auth Revert "Compile with C++." 2019-04-21 12:27:40 +02:00
bittorrent [bittorrent] I'm not sure, but I guess it was a bug here. 2019-11-15 17:29:58 +01:00
file [cgi] Proper format on 32bit 2020-07-04 13:44:41 +02:00
finger Revert "Compile with C++." 2019-04-21 12:27:40 +02:00
fsp Revert "Compile with C++." 2019-04-21 12:27:40 +02:00
ftp Revert "Compile with C++." 2019-04-21 12:27:40 +02:00
gopher [gopher] Nothing is easy as it seems. Refs #34 2019-05-13 12:46:44 +02:00
http [encoding] Do not announce "deflate" as supported encoding method 2019-12-22 11:30:12 +01:00
nntp Revert "Compile with C++." 2019-04-21 12:27:40 +02:00
rewrite [rewrite] Update prefixes 2020-07-05 05:58:25 +02:00
smb Revert "Compile with C++." 2019-04-21 12:27:40 +02:00
test Compilation fix. make test failed. 2010-08-08 09:38:39 +02:00
Makefile Bug 744: Add tests. There are four failures. 2007-07-19 13:46:47 +03:00
README.timegm Move README.timegm to the same directory as date.c. 2007-01-13 10:01:51 +02:00
about.c Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
about.h Remove empty lines in start of header files 2005-11-15 11:33:27 +01:00
common.c Revert "Compile with C++." 2019-04-21 12:27:40 +02:00
common.h Revert "Compile with C++." 2019-04-21 12:27:40 +02:00
data.c Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
data.h Remove empty lines in start of header files 2005-11-15 11:33:27 +01:00
date.c parse_time: set tm_sec to zero before conditional second parsing 2008-02-28 23:38:42 +02:00
date.h Remove empty lines in start of header files 2005-11-15 11:33:27 +01:00
header.c Better handling of content-disposition (line without semicolon) 2016-08-21 22:02:46 +02:00
header.h Better handling of content-disposition (line without semicolon) 2016-08-21 22:02:46 +02:00
protocol.c bug 764: Initialize the right member of union option_value 2012-11-03 22:16:32 +02:00
protocol.h Handle mailcap's copiousoutput without an external pager. 2010-07-24 17:07:18 +02:00
proxy.c Revert "Compile with C++." 2019-04-21 12:27:40 +02:00
proxy.h Bug 1013: Don't assume errno is between 0 and 100000 2008-08-03 17:56:41 +03:00
uri.c [ssl] Let requests default to https 2020-06-25 10:40:59 +02:00
uri.h Revert "Compile with C++." 2019-04-21 12:27:40 +02:00
user.c Revert "Compile with C++." 2019-04-21 12:27:40 +02:00
user.h Remove empty lines in start of header files 2005-11-15 11:33:27 +01:00

README.timegm

This file contains description of our my_timegm() function in date.c. It was
posted as a mail to links-list by Stephane Chazelas, and I thought it may be
interesting for someone, so I decided to include it in the ELinks distribution.




Un explanation for it as one (me to start with) may wonder why
this works.

We first change of calendar. To make things easy, let's say
that 0/0/0 0:0:0 in our new calendar is the Marsh 1st 1968, so
just after a february 29th as 1968 was a leap year.

if y/m/d h:min:s is time in our calendar
and
   Y/M/D h:min:s in the new calendar

M = m - 1 - 2 (+ 12 if m < 3)
Y = y - 68 (-1 if m < 3)
D = d - 1

at Y/0/0 0:0:0, there has been Y / 4 leap years in the past, so
(int) 365 * Y + Y / 4 days have past.

at Y/M/0 0:0:0, lets find how many days have past since Y/0/0:

                   |Mar                                        Feb
                  M| 0   1   2   3   4   5   6   7   8   9  10  11
-------------------+-----------------------------------------------
 days in that month|31  30  31  30  31  31  30  31  30  31  31  28 or 29
-------------------+-----------------------------------------------
  x = days at Y/M/0| 0  31  61  92 122 153 184 214 245 275 306 337
-------------------+-----------------------------------------------
first approximation|
         y = 30 * M| 0  30  60  90 120 150 180 210 240 270 300 330
-------------------+-----------------------------------------------
              x - y| 0   1   1   2   2   3   4   4   5   5   6   7
-------------------+-----------------------------------------------
(M + 4) * 3 / 5 - 2| 0   1   1   2   2   3   4   4   5   5   6   7
-------------------+-----------------------------------------------

x - y = (M + 4) * 3 / 5 - 2

x = 30 * M + (M + 4) * 3 / 5 - 2

x = (153 * M + 2) / 5

So at Y/M/D 0:0:0,

Y * 1461 / 4 + (153 * M + 2) / 5 + D days have past since
the 1st of March of 1968

1st of March of 1968 was 671 days before 1970 Jan 1st (year 0
for unix time())

So
t = s + 60 * (min + 60 * (h + 24 * (Y * 1461 / 4 + (153 * M + 2) / 5 + D - 671)))
t = s + 60 * (min + 60 * (h + 24 * (Y * 1461 / 4 + (153 * M + 2) / 5 + d - 672)))

This shouldn't work past 2100/02/28 23:59:59 as 2100 is not a leap year.

--
St<E9>phane