要するに、MSVCRT と MinGW MSYS の両方が競合することなく TZ 環境変数を共有する方法を教えてください。または、競合することなく両方のタイムゾーンをサポートする方法は?
さらに詳しい情報
MSYS の date コマンドで正しい現地時間を表示するために、また MSYS 自体が MSVCRT ではなく独自の C ランタイムを使用するため、GNU C ライブラリのドキュメントに従ってTZ 環境変数を設定しました。
export TZ="BRT+3BRST,M10.3.0/0,M2.3.0/0"
残念ながら、これは DST 名の部分を規定するMicrosoft C ランタイム仕様と競合します。
地域で夏時間がまったく実施されていない場合は、dzn の値を指定せずに TZ を設定します。C ランタイム ライブラリは、夏時間 (DST) の計算を実装するための米国の規則を想定しています。
したがって、TZ 変数に DST 名が存在するだけで、に依存するプログラム_tzset
が米国外で誤動作する原因になります。これは Bazaar DVCS の場合で、MSVCRT は TZ 設定に基づいて DST 期間に既に入っていると想定しているため、1 時間遅れて間違ったコミット時間を取得しています。TZ を空のままにしておくと、MSYS の日付には UTC 時間が表示されますが、MSVCRT (および Bazaar) は問題なく動作します。上記のように TZ を設定すると、MSVCRT はコミット時間に 1 時間を追加しますが、MSYS の日付には現地時間が表示されます。
Bazaar が影響を受けるのは、Windows で MSVCRT を使用する Python を使用しているためです。DST名からすべてを削除できますが、MSYSの日付コマンドが壊れます。TZ の値もいくつか試しました。MSYS は、上記の GNU リファレンスで説明されている以外のタイムゾーン サポートを欠いているようです。また、Bazaar を呼び出すときだけ TZ を設定しないようにするか、date コマンドを呼び出すときだけ TZ を設定するのではなく、より一般的な解決策にしたいと考えました。
代替フォーマットと zoneinfo データベース
上記の GNU ドキュメントの 3 番目の形式である TZ の代替形式がありますが、次のように MSYS ではサポートされていないようです。
しかし、POSIX.1 標準は、最初の 2 つの形式の詳細のみを指定します。
この 3 番目の形式は、次のように、MSYS でもサポートされていないように思われるTZ の別の形式を記述しているIANA のタイム ゾーン データベースにすぎないようです。
拡張 POSIX 実装でデータベースを使用するには、TZ 環境変数を場所の完全な名前に設定します
TZ="America/New_York"
。
IANA の zoneinfo を手動で MSYS にインストールしようとしても成功しませんでした。これらの記述が正しく、そのフォーマットが MSYS によって認識されないのか、それとも単に zoneinfo データ ファイルを正しくインストールできなかっただけなのか、私にはわかりません。コンパイルされたバージョンが見つからず、自分でコンパイルすることもできなかったので、Ubuntu の tzdata パッケージを試してみました。
しかし、私にとって奇妙なことは、上記の GNU C ライブラリのドキュメントが、タイムゾーン データベースが既に付属していることを示していることです (私には zoneinfo のように聞こえます)。ただし、前述のように、MSYS のどこにもインストールされているタイムゾーン データベースが見つかりません。また、タイムゾーンに関連する mingw-get パッケージも見つかりません。開発者が単にリリースから削除したのだろうか。ドキュメントには次のように書かれています。
GNU C ライブラリには、世界のほとんどの地域のタイム ゾーン情報の大規模なデータベースが付属しています。このデータベースは、ボランティアのコミュニティによって維持され、パブリック ドメインに置かれています。
つまり、MSYS で zoneinfo または同様の代替作業を行うことができれば、上記のように TZ を設定する現在のアプローチを放棄できます。ただし、MSYS でのタイムゾーン サポートに関する適切な情報は見つかりません。