Free-Photos via Pixabay
米国と欧州の日付フォーマットの違いにより、児童ポルノ送信容疑
9月のことだが、スペインの新聞のニュースを読んだ。ある家族のもとに、突然4人の警官が捜査令状を持って飛び込んできた。そして、家のものを全てひっくり返して、コンピューターとモバイルデバイスを、ことごとく持ち去った。そして家族は悪夢の7ヶ月間を過ごした(
EL PAÍS)。
警察がその家に踏み込んだのは2017年のことである。なぜ警察が、その家に現れたのか、事件は前年にさかのぼる。捜査官たちは、2016年にFacebookに児童ポルノをアップロードした人物を追っていた。スペインの警察は、アメリカからIPアドレスと接続日を受け取った。IPアドレスは動的に変わる。だから、犯罪がおこなわれた瞬間に、そのIPアドレスで接続していたのが誰かを、突き止めなければならない。
アメリカからスペインに送られた日付は、
10/11/2016だった。アメリカの日付表記では、この表記は
2016年10月11日と解釈する。
スペインでは違う。同じ表記を、
2016年11月10日と解釈する。10月11日と11月10日は、別の日だ。警察は、
まったく無関係な家に踏み込み、全てのコンピューターとモバイル機器を押収して、家族を容疑者にしてしまったのだ。
検察も捜査判事も間違いに気づいていなかった。彼らが、アメリカからのレポートをきちんと読んでいたかも怪しいそうだ。警察に押収されたコンピューターには、家族の仕事の機密情報も入っていた。家族は、なぜ自分たちに容疑が掛けられているのかも知らされなかった。間違いに気づいたのは、家族を守るための弁護士だった。
この話を読んだとき、プログラマーなら「ありうるだろうな」と思うかもしれない。プログラムを書いていて、日付の処理はかなり面倒くさい部類に入る。
世界各地の時差の存在。
地域ごとの表記の違い。
それらを解決するための処理が、プログラミング言語に含まれていることも多い。また、プログラミング言語自体になくても、多くの人が使うライブラリ(プログラムの命令集)として存在していることもある。
そうした、プログラムで困る「日付の話」を今回はしよう。
プログラムを書いていて困る「日付フォーマット」の違い
プログラムは、世界各地で使われる。日本でしか使わないプログラムでも、他の国とデータをやり取りするのならば、日時の処理を避けて通るわけにはいかない。そうした処理を無視してプログラムを書けば、ある時間に送ったメールが、別の場所では未来から届くといったことも起こりうる。
時差の話は、今回は置いておこう。今回の悲劇は
日付の表記の違いで起きた。年月日を表す方法は、
日本人なら「2020年11月22日」「2020/11/22」のような方法だろう。しかし、プログラムの本場である
アメリカでは違う。
Webページで多く使われているJavaScriptで、同じ日付を、最も単純な方法で表示するとどうなるか。「
Nov 22 2020」になる。この日付をプログラムで入力するときは「
new Date(2020, 10, 22)」というように書く。多くのプログラミング言語で、
11月は「10」と書く。1月なら「0」だ。なぜ、こんな不可解な書き方をするのか。
アメリカでは、月を「文字」で書く。文字を、「配列」と呼ばれる表のような形式に並べて、文字を表示する。
配列という表は「0」から数える。「Jan」が0、「Feb」が1、「Mar」が2である。アメリカ人は、これが「分かりやすい」と考えてプログラムを書いた。しかし、アメリカ人以外には分かり難い。アメリカ人の常識は、世界の常識ではないからだ。
では、文字ではなく数字で表現すればよかったかというと、そうはならない。国による表記方法がまちまちなので、やはり混乱を招いただろう。
プログラムで日付形式を表すときは、年をy、月をm、日をdのようなアルファベットで表現することが多い。yyyyなら、年を4桁で表現するという意味だ。いくつかの国の数字での年月日の表記を見てみよう(
日付の形式)。
・カナダ(英語) dd/mm/yy 24/08/01
・デンマーク語 yyyy-mm-dd 2001–08–24
・フィンランド語 dd.mm.yyyy 24.08.2001
・フランス語 dd/mm/yyyy 24/08/2001
・ドイツ語 yyyy-mm-dd 2001–08–24
・イタリア語 dd/mm/yy 24/08/01
・ノルウェー語 dd-mm-yy 24–08–01
・スペイン語 dd-mm-yy 24-08-01
・スウェーデン語 yyyy-mm-dd 2001-08-24
・イギリス dd/mm/yy 24/08/01
・米国 mm-dd-yy 08-24-01
・タイ dd/mm/yyyy 24/08/2001
見事にバラバラである。こうした日付の表示を、各国ごとに対応させるのは面倒だということが分かるだろう。自分ではやりたくない作業の筆頭にあげられるのではないかと思う。