Emacs与系统时间相比减少了两个小时。我试图用谷歌搜索问题,但没有运气。我需要配置什么来纠正此问题?我怀疑这与GMT到我居住的地方不同(我位于GMT + 2区域,也就是说,如果我从系统时间2中减去,我将获得Emacs中的时间)。所以...也许是某些语言环境设置?
因此,我只是弄乱了一个git存储库:通过magit
用过的Emacs时间进行的提交,并将它们放在其他人进行的提交之前:(
在这里,我添加了一个截图,显示了区别。的输出date
是正确的时间,但是在Modeline条纹上的时间是错误的。
编辑0:
似乎Stefan是正确的,并且Git中的时间未与Emacs中的时间相关(下面的屏幕快照来自Cygwin终端)。
这个问题与Git以及Emacs都息息相关-某种程度上,他们使用的系统API在我的PC上不同步-这是我需要进行设置以使其与它们对齐的问题。问题是两者都使用什么设置?
编辑1:
这是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;
}
Run Code Online (Sandbox Code Playgroud)
看起来好像tz
出错了。我不知道是什么_ftime
-但这似乎没有在Emacs的资料中定义,它必须来自其他地方...
更多研究:
从MSI安装的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)))
Run Code Online (Sandbox Code Playgroud)
输出:(实际时间为12:56)
It is now 10:56:55 of Tuesday, 6/04/2013 (GMT+0)
Run Code Online (Sandbox Code Playgroud)
ActivePerl的Perl(从Cygwin安装):
It is now 10:56:55 of Tuesday, 6/04/2013 (GMT+0)
Run Code Online (Sandbox Code Playgroud)
输出:(实际时间是12:52)
Tue Jun 4 12:52:17 2013
Run Code Online (Sandbox Code Playgroud)
从MSI安装的CPython。
$now = localtime;
print $now;
Run Code Online (Sandbox Code Playgroud)
输出:(实际时间为13:03)
2013-06-04 11:03:49.248000
Run Code Online (Sandbox Code Playgroud)
从MSI安装的JavaScript,Node.js:
Tue Jun 4 12:52:17 2013
Run Code Online (Sandbox Code Playgroud)
输出:(实际时间为12:09)
Tue Jun 04 2013 10:09:05 GMT+0000 (IST)
Run Code Online (Sandbox Code Playgroud)
重击(Cygwin):
import datetime
str(datetime.datetime.now())
Run Code Online (Sandbox Code Playgroud)
输出:(实际时间为13:10)
04 Jun, 2013 13:10:37
Run Code Online (Sandbox Code Playgroud)
C#:
2013-06-04 11:03:49.248000
Run Code Online (Sandbox Code Playgroud)
输出:(实际时间为13:13)
Today: 04-Jun-13 13:13:37
Run Code Online (Sandbox Code Playgroud)
编辑2:
今天,我们的系统管理员为我提供了一个VM,可以将我的东西移动到其中。有趣的是,发生的事情是这次我通过Cygwin获得了Git,现在Git显示了正确的时间。但是,Emacs仍然显示错误的时间。如果从Cygwin启动,Python(不是与Cygwin捆绑在一起的那个)显示正确的时间,如果从Emacs启动,则显示错误的时间!无论如何启动,SBCL都会显示错误的时间。
这可能是某些网络设置吗?也许与Windows如何同步系统时间有关?
Windows 程序从您通过控制面板设置的系统获取时区信息。时间本身也可以手动设置,但更常见的是让 Windows 通过Windows 时间服务(基于 NTP;有关使用方法,请参阅WinXP 支持文章)与时间服务器同步。AFAIK Windows 时间服务与时区无关,并且是问题中涉及的唯一与网络相关的事物。
\n\n理论上,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 月的相关线程中。
\n\nSO 上已经发布了针对 Python 的解决方法,并且与C ++ 完全相同,它对 MSCRT 问题的解释比之前链接的线程更简短。
\n\n也许 Emacs 与这个问题有一些特殊的关系。2009 年 2 月 GNU Emacs 开发者邮件列表上的一条消息报告 Emacs 22.3 显示正确的时间,而 Emacs 23 则不然。根据回复的建议,作者将报告发布到 Cygwin 邮件列表\xe2\x80\x93,但没有得到回复。2012 年 12 月,通过记录该问题及其解决方法解决了该问题(请参阅 参考资料/usr/share/doc/Cygwin/emacs.README
)。我没有 Cygwin,无法在其 CVS 中找到此文件,因此请使用其中的信息编辑我的答案。
我个人认为在你的系统中设置(和导出)TZ 环境变量~/.profile
是一个好主意。Cygwin 显然已经破坏了时区处理,因此覆盖所有相关的内容应该是最安全的事情,因为它只为黑魔法留下了一点空间。也许tzset
会起作用,也许不会,您必须将时区设置为恒定值。
尝试在 Cygwin.com 上谷歌搜索 \xe2\x80\x9etimezone\xe2\x80\x9c以获取更多资源。
\n 归档时间: |
|
查看次数: |
958 次 |
最近记录: |