[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