[Mono-dev] DateTime.Now gives a wrong time

k0l0b0k.void at gmail.com k0l0b0k.void at gmail.com
Wed Oct 12 16:05:12 EDT 2011


> On my Debian box (using debian packaged Mono) everything is fine.
> 
> fog at ania:~$ csharp
> Mono C# Shell, type "help;" for help
> Enter statements below.
> csharp> Console.WriteLine("{0}", DateTime.Now);
> 12/10/2011 14:18:58
> csharp>
> 
> fog at ania:~$ date
> Wed Oct 12 14:19:04 CEST 2011
> 
> Can you show us your env?
> 
> federico
> 
> > user at server:~# date
> > Wed Oct 12 14:09:10 FET 2011
> 
> FET? This is an interesting time zone:
> http://en.wikipedia.org/wiki/Further-eastern_European_Time
> 
> It seems that Mono is thinking that you're now on EET
> (Eastern Europe Time, UTC+2), your former time zone.
> 
> Either you don't have correct time zone files or there is
> a bug in Mono's GetTimeZoneData.
> 
> Unlike other apps that only show the current time, Mono
> needs valid time probes for the whole year, so you can
> have invalid time zone info even if other apps seems to work.
> 
> Maybe it helps when I tell you that on 2012/01/01 the bug will
> vanish on its own :)
> 
> Robert


Hello guys, thanks for your replies. I think, I've understand the situation. 
Some weeks ago, Ukraine and Belarus has timezone changes by law, and now we 
are FET timezone (GMT+3, without DST). As Robert pointed, I've look into 
TimeZone.* methods, and their native implementations, and found, that wrong 
GMT offset brings by glibc's mktime function. But, it is not mktime bug 
(however, I'm not sure), it is mono issue - code from icall.c:5931:

    memset (&start, 0, sizeof (start));

    start.tm_mday = 1;
    start.tm_year = year-1900;

    t = mktime (&start);

I've found, that setting only tm_year in start struct is insufficiently. At 
least tm_mon must be set too, to avoid this issue. Simple test:

#include <stdio.h>
#include <time.h>
#include <memory.h>

int main(int argc, char *argv[])
{
    struct tm t;
    memset(&t, 0, sizeof(t));
    t.tm_year = 111; // 2011
    t.tm_mon = 10;   // wrong tm_gmtoff will received if comment out this line
    mktime (&t);
    printf("2011: %d\n", t.tm_gmtoff);

    return 0;
}

this is 100% reproducible inaccuracy for FET timezone, on all my accessible 
machines: 
* Debian Squeeze + mono 2.6.7 up to date
* Ubuntu 11.10 + mono 2.10.5 up to date
* Arch Linux + mono 2.10.5 up to date

on one machine, with Ubuntu 11.04, which is not updated last weeks, and stay 
on EEST timezone - all works fine.

I'm vote for setting month value to "start" struct - today it happen with FET, 
tomorrow it can be happen with any other timezone - world is changing all the  
time...

Also, thanks God, I'm saving all times as UTC+0 in my server databases ;)


More information about the Mono-devel-list mailing list