Emacs和Git在Windows上显示错误的时间

Emacs离开系统时间两个小时。 我试图谷歌的问题,但没有运气。 我需要configuration什么来纠正这个问题? 我怀疑这是从GMT到我住的地方(我在GMT + 2区,也就是说,如果我从系统时间2减去,我会在Emacs的时间)差异。 所以…也许这是一些区域设置?

我只是搞砸了一个git仓库,因为:通过magit使用Emacs的时间提交,并把他们之前提交的其他人:(

在这里输入图像说明

在这里,我添加了一个显示不同的截图。 从date的输出是正确的时间,但模式边缘上的时间是错误的。

EDIT0:

看来Stefan是对的,在Git中的时间没有连接到Emacs的时间(下面的屏幕截图来自Cygwinterminal)。

这个问题与Git相关,就像Emacs一样 – 他们在某种程度上使用了一些在我的电脑上不同步的系统API,这是我需要设置的,以便将它们alignment。 问题是他们都使用什么设置?

在这里输入图像说明

EDIT1:

下面是Emacs用于检索时间的代码afaik:

 /* Emulate gettimeofday (Ulrich Leodolter, 1/11/95). */ int gettimeofday (struct timeval *__restrict tv, struct timezone *__restrict tz) { struct _timeb tb; _ftime (&tb); tv->tv_sec = tb.time; tv->tv_usec = tb.millitm * 1000L; /* Implementation note: _ftime sometimes doesn't update the dstflag according to the new timezone when the system timezone is changed. We could fix that by using GetSystemTime and GetTimeZoneInformation, but that doesn't seem necessary, since Emacs always calls gettimeofday with the 2nd argument NULL (see current_emacs_time). */ if (tz) { tz->tz_minuteswest = tb.timezone; /* minutes west of Greenwich */ tz->tz_dsttime = tb.dstflag; /* type of dst correction */ } return 0; } 

它看起来像是错误的。 我不知道_ftime是什么 – 但它似乎没有在Emacs的来源中定义,这必须来自其他地方…

一些更多的研究:

从微星安装的SBCL给出了这个:

 (defconstant *day-names* '("Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" "Sunday")) (multiple-value-bind (second minute hour date month year day-of-week dst-p tz) (get-decoded-time) (format t "It is now ~2,'0d:~2,'0d:~2,'0d of ~a, ~d/~2,'0d/~d (GMT~@d)" hour minute second (nth day-of-week *day-names*) month date year (- tz))) 

输出:( 实际时间是12:56)

 It is now 10:56:55 of Tuesday, 6/04/2013 (GMT+0) 

来自ActivePerl的Perl(从Cygwin安装):

 $now = localtime; print $now; 

输出:( 实际时间是12:52)

 Tue Jun 4 12:52:17 2013 

CPython,从MSI安装。

 import datetime str(datetime.datetime.now()) 

输出:( 实际时间是13:03)

 2013-06-04 11:03:49.248000 

JavaScript,Node.js,从MSI安装:

 Date(); 

输出:( 实际时间是12:09)

 Tue Jun 04 2013 10:09:05 GMT+0000 (IST) 

Bash(Cygwin):

 $ date 

输出:( 实际时间是13:10)

 04 Jun, 2013 13:10:37 

C#:

 using System; namespace TestTime { class Program { static void Main(string[] args) { DateTime d = DateTime.Now; Console.WriteLine("Today: {0}", d); Console.ReadLine(); } } } 

输出:( 实际时间是13:13)

 Today: 04-Jun-13 13:13:37 

EDIT2:

今天我们的系统pipe理员给了我一个VM来移动我的东西。 有趣的是,这里发生的事情是,这次我通过Cygwin得到了Git,现在Git显示了正确的时间。 但Emacs仍然显示错误的时间。 Python(不是与Cygwin捆绑在一起的)显示从Cygwin启动的正确时间,以及从Emacs启动的错误时间! 无论如何推出SBCL显示错误的时间。

这是否可能是一些networking设置? 也许与Windows如何同步系统时间有关?

Windows程序从您通过控制面板设置的系统获取时区信息。 时间本身也可以手动设置,但通常让Windows通过Windows时间服务与基于NTP的时间服务器进行同步(有关使用情况,请参阅WinXP支持文章 )。 AFAIK Windows时间服务与时区无关,是唯一与网络有关的问题。

Cygwin程序理论上应该和其他任何* NIX一样。 他们从/etc/localtime文件TZ环境变量中获取时区信息。 在我的情况(Debian)中, /etc/localtime/usr/share/zoneinfo/Europe/Prague的副本,但也可能是指向该位置的符号链接。 TZ可以包含相对于/usr/share/zoneinfo路径,并且优先于/etc/localtime

实践是一个不同的故事。 根据Cygwin邮件列表上的一个线程 ,Microsoft C运行时(mscrt * .dll)极其过时的时区处理,它用于非Cygwin程序。 这与你所得到的结果是一致的。 相关技术信息来自2005年8月的一个主题,以及2010年5月的相关技术信息。

对于已经发布在Python上的Python有一个解决方法, 对于C ++来说也是一样 ,它比以前链接的线程对MSCRT问题有一个更简单的解释。

也许Emacs有一些特殊的问题。 2009年2月关于GNU Emacs开发人员邮件列表报告的消息 Emacs 22.3显示正确的时间,而Emacs 23不显示。 根据回复的建议,作者将报告张贴到Cygwin邮件列表 – 但没有得到答复。 2012年12月,该问题通过对其及其解决方法进行了解释(请参阅/usr/share/doc/Cygwin/emacs.README )。 我没有Cygwin,并且无法在CVS中找到这个文件,所以请编辑我的答案与从那里的信息。

我个人认为在~/.profile中设置(和导出)TZ环境变量是个好主意。 Cygwin显然已经打破了时区处理,所以压倒一切有关的应该是最安全的事情,因为它只留下一个黑魔法的空间。 也许tzset会工作,也许不会,你将不得不把你的时区设置为一个恒定的值。

尝试在Cygwin.com上搜索“时区”以获取更多资源。