人生100年!生涯エンジニア人生!

楽しいエンジニア人生!

ロシア語由来のキエフ(Kiev)表記から、ウクライナ語のキーウ(Kyiv)に変更することを、エンジニア的に考える

経緯

首都「キエフ」の表記をウクライナ語の「キーウ」に変更へ 日本政府:朝日新聞デジタル www.asahi.com

現在、日本国内で広く使われている「キエフ(Kiev)」は、ロシア語の発音に由来する。一方、ウクライナ語は「Kyiv」とつづり、発音は「キーウ」に近い。

ということなので、これについて何らかの変更依頼はあると思われるのでまとめてみます。

前提知識

地球は球体で自転によって太陽が動きます。球体なので太陽が見える位置が変わります。太陽の位置によって時刻が変化する。

※フラットアース支持者はお帰りください。

地域によって時刻が変化するが、それは「タイムゾーン (Time Zone)」呼ばれ、その基準と運用は「協定世界時(Coordinated Universal Time)」で決められている。 エンジニアなら、TZやUTCという略語を聞いたことあるでしょう。

この協定世界時を、コンピューターシステムでは、どのように運用されているのでしょうか?

大きく3つの運用が存在します。

  • IATA Timezone Codes
  • Windows
  • IANA Time Zone Database

まず、最初のIATA Timezone Codesです。名前のとおりIATA(International Air Transport Association)は国際航空運送協会のことで航空業界のタイムゾーンで、その辺りのシステムでは組み込まれるんだろうと思いますが、その辺りの知識がないし今回の記事とは関係ないので割愛します。

次に、Windowsです。WindowsタイムゾーンMicrosoft自身が管理しています。これは昔からなので、WindowsタイムゾーンMicrosoft管理ということだけ覚えておいてください。今回の記事では軽く触れます。

最後が、IANA Time Zone Databaseです。こちらは2011年10月14日よりICANNのIANAが管理していますが、その前はArthur David Olson氏が始めたプロジェクトです。

サマータイムはもちろん、うるう秒があったことまでも細かく記載されており、ドキュメントの情報量がすごくて一度見ると良いです。

How to Read the tz Database

また、政治的なことでの国境変更や国名の変更は珍しくないので当初から"地域/地名"形式を使用しています。だがしかし今回のようなキーウ(キエフ)の件は地名の変更になってしまい影響することになりました。

IANA Time Zone Databaseについては、色々とネタが豊富なのですが、今回はこれぐらいにしておきます。

ウィキペディアも読んでて楽しいので軽く読んでおきましょう。 ja.wikipedia.org

IANA Time Zone Databaseを更新するところはGitHubリポジトリーがあります。

キーウ(キエフ)の件は、で2022年4月13日にCommitされています。ただ、2022年6月24日時点ではリリースはされていません。そのため各ディストリビューションには反映されていません。

github.com

リリースされて、さらにOSが更新されたときに変更されるでしょう。

また、直接更新する方法もありますが、そこはググると出てくるので、自己責任でやってみてください。私はDockerを使って試しました。

OS

まずはOS周りは見てましょう。

Windows

Microsoftが管理しているのでOSのアップデートのときにあると思いますが、現状ではWindowsタイムゾーンにキーウ(キエフ)はないので追加することはないでしょう。

なお、コマンドプロンプトtzutil /lとするとWindowsが持っているすべてのタイムゾーンを表示できます。

docs.microsoft.com

WSL2などインストールすると、そこは別のOSが動きますので、たえばUbuntuだったらIANA Time Zone Databaseで管理されます。当然ながら、ホストOSであるWindowsには影響ありません。

Windows以外

Linux,BSD,macOS,iOS,Androidなどは、IANA Time Zone Databaseです。

/usr/share/zoneinfoに情報があります。/usr/share/zoneinfo/Europe辺りを眺めてみてください。

データベース

次にデータベースを見ていきましょう。今回はMySQLPostgreSQLを取り上げます。

MySQL

マニュアルにzoneinfo databaseについての記載があります。

5.1.15 MySQL Server Time Zone Support dev.mysql.com

If your system has its own zoneinfo database (the set of files describing time zones), use the mysql_tzinfo_to_sql program to load the time zone tables. Examples of such systems are Linux, macOS, FreeBSD, and Solaris. One likely location for these files is the /usr/share/zoneinfo directory. If your system has no zoneinfo database, you can use a downloadable package, as described later in this section. To load the time zone tables from the command line, pass the zoneinfo directory path name to mysql_tzinfo_to_sql and send the output into the mysql program. For example:

IANA Time Zone Databaseをインポートして使用するようですね。OSの更新があったら、こちらの更新もすると良いようですね。

PostgreSQL

マニュアルにzoneinfo databaseについての記載があります。

B.4. Date/Time Configuration Files www.postgresql.org

timezone_abbreviations can be set to any file name found in .../share/timezonesets/, if the file's name is entirely alphabetic. (The prohibition against non-alphabetic characters in timezone_abbreviations prevents reading files outside the intended directory, as well as reading editor backup files and other extraneous files.)

インストールしたところにtimezonesetsというのがあるらしい。 GitHubで確認すると、IANA Time Zone Databaseにソックリですね。 このtimezonesetsをOSとは別に変更する必要がありますね。

github.com

なお、最新版(14.4)でもEurope/KievだったりするのでPostgreSQLの更新を待ちましょう。

開発言語

今回はPython,Perl,JavaScript,Ruby,PHPを取り上げます。

開発言語は、基本的にIANA Time Zone Databaseを直接読み込むことはしていないようです。言語自体が情報を持っていたりライブラリー(この記事ではライブラリーに統一)の中に情報を持っていることが多いです。

ただ、気を付けていただきたいのが、OSや言語のタイムゾーンが更新してない状態で、タイムゾーン表示を見た目だけ変更して日時表示を行うところに流用ししてしまうとエラーもしくは正しい値が取れません。

PHPの場合は間違った地名の日時を表示しようとするとExceptionが発生して動きません。 下のコードはPHPですが、プルダウンメニューとかを見た目だけこっそりと修正したいなら、こんな感じで差し替えするしかないですね。

エルビス演算子を使っているので5.3でも動きます。

<?php
$timezone_kyiv = [312 => "Europe/Kyiv"];
$timezone_identifiers = DateTimeZone::listIdentifiers();
foreach ($timezone_identifiers as $key => $value) {
    $value = $timezone_kyiv[$key] ?: $value;
    echo $key . ':'. $value . "\n";
}

Python

3.9からIANA Time Zone Databaseをサポートしていて、直接読んで使用しています。

docs.python.org

つまり、OSでタイムゾーンが更新されると、Pythonタイムゾーンも自動的に更新されます。

import zoneinfo
zoneinfo.available_timezones()

なお、このようにすると、タイムゾーンの一覧が出てきます。

それより古いバージョンはpytzかな??

pytz.sourceforge.net

Perl

ライブラリーであるDateTime::TimeZoneを使います。

metacpan.org

内部に情報を保持しているのでライブラリーの更新があったときに変更されるようです。

DateTime::TimeZone->all_namesで一覧が出てきます。

JavaScript

標準はIntl.DateTimeFormatで地名はサポートしていません。このデータはブラウザーが保持しているようで、ブラウザーが更新することで変わります。

地名を使用したいときはライブラリーがあります。なおライブラリー内部に情報を保持しているのでライブラリーの更新があったときに変更されるようです。

github.com

Ruby

GemライブラリーであるTZInfoを使います。

rubydoc.info

内部に情報を保持しているのでGemライブラリーの更新があったときに変更されるようです。

require 'tzinfo'
TZInfo::Timezone.all_country_zone_identifiers

なお、このようにすると、タイムゾーンの一覧が出てきます。

PHP

内部で情報を保持しています。PHP自体の更新があったときに変更されるようです。

ちなみにDateTimeZone::listIdentifiersです。

www.php.net

まとめ

タイムゾーンのキーウ(キエフ)の対応は各OSやデータベースや開発言語でまちまちです。

・IANA Time Zone Databaseは更新がありましたがリリースはされていない。(2022年6月24日時点)

・ライブラリー更新なのかOS更新なのかは、データベースや開発言語のマニュアルを参考にして対応しよう

・今すぐ対応するなら表示だけこっそり修正しよう!