<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>
This stuff is tricky. Maybe impossible. And requires a fair amount of time and attention.<br>Which I might not have right now, but which I definitely tried to apply at the time.<br><br>Can you compare with some historical versions?<br>e.g.<br><br>http://modula3.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/m3core/src/time/POSIX/DatePosix.m3?rev=1.1.1.2;content-type=text%2Fplain<br>http://modula3.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/m3core/src/time/POSIX/TimePosix.m3?rev=1.1.1.1;content-type=text%2Fplain<br><br><br>and notice:<br><br>http://modula3.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/m3core/src/time/POSIX/TimePosix.m3<br>Revision <b>1.3</b>: <a href="http://modula3.elegosoft.com/cgi-bin/cvsweb.cgi/%7Echeckout%7E/cm3/m3-libs/m3core/src/time/POSIX/TimePosix.m3?rev=1.3;content-type=text%2Fplain" class="download-link">download</a> - view: <a href="http://modula3.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/m3core/src/time/POSIX/TimePosix.m3?rev=1.3;content-type=text%2Fplain" class="display-link">text</a>, <a href="http://modula3.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/m3core/src/time/POSIX/TimePosix.m3?rev=1.3;content-type=text%2Fx-cvsweb-markup" class="display-link">markup</a>, <a href="http://modula3.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/m3core/src/time/POSIX/TimePosix.m3?annotate=1.3">annotated</a> - <a href="http://modula3.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/m3core/src/time/POSIX/TimePosix.m3?r1=1.3#rev1.3">select for diffs</a><br>Note: This also fixes the UTC timezone on Solaris, Interix, HP-UX, Cygwin, which appear to have been historically broken.<br><br><br>I'm usually a bit nervous when I make accusations of long-term breakage.<br><br><br>And yeah there is a general problem of determining when daylight savings is in effect.<br>The rules very often change. The operating system needs a lot of data to know this.<br><br><br>This stuff should be easy to debug without m3gdb.<br>Just print stuff to stdout liberally.<br><br>Aha, see here:<br>http://modula3.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/m3core/src/time/POSIX/Attic/DateBsd.m3?rev=1.1.1.2;content-type=text%2Fplain<br><br><pre>  (* adjust result to reflect "d.offset" *)<br>    EVAL Utime.time(ADR(now));<br>    local_now := Utime.localtime(ADR(now));<br>    IF local_now.tm_isdst > 0 THEN<br>      (* decrement the local time zone by one hour if DST is in effect *)<br>      DEC(local_now.tm_gmtoff, 1 * SecsPerHour)<br>    END;<br></pre><br> - Jay<br><br>> To: m3devel@elegosoft.com; jay.krell@cornell.edu<br>> Date: Sun, 10 Apr 2011 15:45:16 -0700<br>> From: mika@async.caltech.edu<br>> Subject: [M3devel] time conversion problems : Date.ToTime on AMD64_LINUX<br>> <br>> Hello m3devel (especially Jay),<br>> <br>> I'm having some time conversion problems.  I *believe* (a bit hard to<br>> verify because m3gdb isn't working!!) that Date.ToTime called on<br>> Jan 1 1970 in timezone "UTC" or "GMT" is returning -3600 for me.<br>> <br>> I note the following (fairly recent) code in DatePosixC.c:<br>> <br>> #ifdef _TIME64_T<br>>     t = mktime64(&tm);<br>> #else<br>>     t = mktime(&tm);<br>> #endif<br>> #ifdef DATE_BSD<br>>     if (t == -1)<br>>         goto Exit;<br>> <br>>     /* adjust result to reflect "date->offset" */<br>> #ifdef _TIME64_T<br>>     time64(&now);<br>>     local_now = localtime64(&now);<br>> #else<br>>     time(&now);<br>>     local_now = localtime(&now);<br>> #endif<br>>     assert(local_now != NULL);<br>>     if (local_now->tm_isdst > 0)<br>>       /* decrement the local time zone by one hour if DST is in effect */<br>>       local_now->m3_tm_gmtoff -= SecsPerHour;<br>> <br>>     /* As above, we must negate "date->offset" to account for the<br>>        opposite sense of that field compared to Unix. */<br>>     t -= ((-date->offset) - local_now->m3_tm_gmtoff);<br>> Exit:<br>> #endif<br>>     return t;<br>> <br>> <br>> What I don't understand is the subtracting off of SecsPerHour if<br>> "now" is DST.  Yeah, now is DST (it's April), but the time I'm<br>> converting was in the winter, and besides GMT and UTC don't even<br>> have DST. <br>> <br>> I don't understand the intent of the code.. can someone explain why<br>> we're subtracting off an hour?  And why is it based on the value of <br>> tm_isdst of the *current* time?  Some additional documentation within<br>> the file would be helpful too.<br>> <br>> Note my conversion returns the correct 0 on various other M3<br>> implementations.<br>> <br>> Note the system time on my system is in a timezone that has DST <br>> (namely, BST) but I have changed the TZ environment variable to UTC or GMT<br>> before calling this code.<br>> <br>>      Mika<br>                                         </body>
</html>