6

Emacs はシステム時間から 2 時間ずれています。問題をグーグルで検索しようとしましたが、うまくいきませんでした。これを修正するには、何を構成する必要がありますか? これは GMT と私の住んでいる場所との違いだと思います (私は GMT+2 ゾーンにいます。つまり、システム時刻から 2 を引くと、Emacs で時刻が得られます)。それで...多分それはいくつかのロケール設定ですか?

そのため、gitリポジトリを台無しにしてしまいました.Emacsのmagit使用時間を使用して作成されたコミットを、他の誰かが作成したコミットの前に配置しました:(

ここに画像の説明を入力

ここに、違いを示すスクリーンショットを追加しました。からの出力dateは正しい時刻ですが、モードライン フリンジの時刻は間違っています。

EDIT0:

ステファンは正しいようで、Git の時刻は Emacs の時刻とは関係がありません (下のスクリーンショットは Cygwin 端末のものです)。

この質問は、Emacs と同様に Git にも関連しています。どういうわけか、彼らは私の PC で同期しないシステム API を使用しています。問題は、両方が使用する設定は何ですか?

ここに画像の説明を入力

EDIT1:

Emacsが時間を取得するために使用するコードは次のとおりです。

/* 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;
}

そして、それは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)))

出力: (実際の時間は 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

MSI からインストールされた CPython。

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

出力: (実際の時間は 13:03)

2013-06-04 11:03:49.248000

MSI からインストールされた JavaScript、Node.js:

Date();

出力: (実際の時刻は 12:09)

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

バッシュ (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:

今日、私たちのシステム管理者は、私のものを移動するための VM をくれました。興味深いことに、今回は Cygwin を介して Git を取得したところ、Git が正しい時刻を表示するようになりました。ただし、Emacs は依然として間違った時刻を表示します。Python (Cygwin にバンドルされているものではない) は、Cygwin から起動すると正しい時刻を示し、Emacs から起動すると間違った時刻を表示します! SBCL は、どのように起動しても間違った時刻を示します。

これはネットワーク設定である可能性はありますか?おそらく、Windows がシステム時刻を同期する方法と何か関係があるのでしょうか?

4

2 に答える 2

1

Windows プログラムは、コントロール パネルで設定したシステムからタイムゾーン情報を取得します。時間自体も手動で設定できますが、 Windows タイム サービス(NTP ベース。使用方法については、WinXP のサポート記事を参照してください)を介して Windows をタイム サーバーと同期させるのがより一般的です。AFAIK Windows Time Service はタイムゾーンとは何の関係もなく、問題に関係する唯一のネットワーク関連のものです。

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 月の関連スレッドにあります。

既に SO に投稿されているPythonの回避策があり、 C++ についてもまったく同じで、以前にリンクされたスレッドよりも MSCRT 問題の簡単な説明があります。

おそらく、Emacs はこの問題に何か特別な関係があるのでしょう。GNU Emacs 開発者メーリング リストの 2009 年 2 月のメッセージでは、 Emacs 22.3 では正確な時刻が表示されるが、Emacs 23 では表示されないことが報告されています。返信からのアドバイスに従って、作成者はレポートを Cygwin メーリング リストに投稿しますが、返信はありません。2012 年 12 月、この問題とその回避策を文書化することで、この問題は解決されました (「参考文献」を参照/usr/share/doc/Cygwin/emacs.README)。私はCygwinを持っておらず、CVSでこのファイルを見つけることができないので、そこからの情報で私の回答を編集してください。

個人的には、TZ 環境変数を設定 (およびエクスポート)~/.profileすることは良い考えだと思います。Cygwin では明らかにタイムゾーンの処理が壊れているため、黒魔術の余地が少ししか残らないため、関連するすべてをオーバーライドするのが最も安全な方法です。tzsetうまくいくかもしれませんし、うまくいかないかもしれません。タイムゾーンを一定の値に設定する必要があります。

詳細については、Cygwin.com で「タイムゾーン」をググってみてください。

于 2013-11-05T23:58:09.960 に答える