国による年月日表記の違いで、児童ポルノ送信容疑誤認逮捕!? プログラマーから見た「日付」問題

国による年月日表記の違いで、児童ポルノ送信容疑誤認逮捕!? プログラマーから見た「日付」問題

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

 見事にバラバラである。こうした日付の表示を、各国ごとに対応させるのは面倒だということが分かるだろう。自分ではやりたくない作業の筆頭にあげられるのではないかと思う。

◆国際規格 ISO 8601

 プログラムを、インターネットに繋がずに利用していた頃には、こうした日付の形式の違いは、それほど大きな問題にはならなかった。日本なら、それこそ年号で書いてあるプログラムもあるだろう。その処理の中だけで完結するプログラムなら、トラブルが発生することもない。

 しかし現在は、ネットワークで全ての世界が繋がっている。日付の表記にしても、各国ごとに表示を変えていたら、混乱の元になる。たとえばスペインの人が、アメリカに出張してデータを見たとき、アメリカ表記になっていたら、最初の事件のようなエラーが起きる。

 日付と時刻に関しては、近年はISO 8601形式で表記することが多い。プログラミング言語の最新のバージョンで、この表記をあつかえるようになっている場合もある(Wikipedia)。

 ISO 8601形式は、日本人にとっては非常に素直に見える形式だ。基本形式と拡張形式があるが、拡張形式の方をよく見る。ISO 8601形式では、日時を「2020-11-22T21:34:56+09:00」と書く。

 「2020-11-22」の部分が日付、「21:34:56」の部分が時刻、「+09:00」はタイムゾーンと呼ばれる、地域ごとの時差に関する情報だ。

 「2020年11月22日」を「2020-11-22」と書く。これならば、最初のような警察のミスも起きなかっただろう。ただ、この形式は、技術者が使う書き方であり、それぞれの国の文化の中で用いられる表記方法ではない。全ての人がこの形式を覚えるというのは無理がある。

 そのため、こうしたミスを防ぐのは難しいだろう。そして、日本もスペイン同様に、アメリカと日付形式が違う。そのため、警察がFacebookやGoogleに問い合わせた結果、似たような冤罪事件が起きる可能性もある。日本で使われている多くのWebサービスは、海外、特に米国のものであるから、起きないとは言い切れない。

 世界各国の日付表記が違う問題は、一朝一夕には解決しなさそうである。

<文/柳井政和>

【柳井政和】

やない まさかず。クロノス・クラウン合同会社の代表社員。ゲームやアプリの開発、プログラミング系技術書や記事、マンガの執筆をおこなう。2001年オンラインソフト大賞に入賞した『めもりーくりーなー』は、累計500万ダウンロード以上。2016年、第23回松本清張賞応募作『バックドア』が最終候補となり、改題した『裏切りのプログラム ハッカー探偵 鹿敷堂桂馬』にて文藝春秋から小説家デビュー。近著は新潮社『レトロゲームファクトリー』。2019年12月に Nintendo Switch で、個人で開発した『Little Bit War(リトルビットウォー)』を出した。

関連記事(外部サイト)