日々のコンピュータ情報の集積と整理

Dr.ウーパのコンピュータ備忘録

2014年12月22日月曜日

JavaScript:ISO8601形式の日時を、ExcelやGoogle Drive SpreadSheetで認識可能な形式に変換する

イントロダクション

日付と時刻を表記する記法として、「ISO 8601」という国際規格があります。


Date and Time Formats
http://www.w3.org/TR/NOTE-datetime



フォーマットの形式としては、上記の「Date and Time Formats」に詳しいフォーマットの形式とサンプルが載っていますが、一例として「日付(年・月・日)と時刻(時・分・秒・ミリ秒)とタイムゾーン」を表した形式(これがISO 8601で表記できる日時の形式で最も長く情報量が多いものでしょう)を以下に示します。

「日付(年・月・日)と時刻(時・分・秒・ミリ秒)とタイムゾーン」を表した形式:
YYYY-MM-DDThh:mm:ss.sTZD

各英字の意味:
YYYY:4桁の年(西暦)
MM:2桁の月
DD:2桁の日
hh:2桁の時
mm:2桁の分
ss:2桁の秒
s:1桁以上の秒以下の数値
TZD:タイムゾーン


具体例)2012年11月5日 21時43分0.004秒(タイムゾーン:日本標準時(JST))の場合:
2012-11-05T21:43:00.004+09:00


ISO 8601形式の日時をExcelやGoogle Drive SpreadSheetで認識可能な形式に変換

さて、ISO 8601形式の日時ですが、そのままでは、Excel Google Drive SpreadSheet のようなソフトウェアで、日時のデータとして認識させることができません

ISO 8601形式の日時を入力すると、ただの文字列として認識してしまいます。

Excel に ISO 8601形式の日時を入力した例  入力した日時: 2012-11-05T21:43:00.004+09:00 =YEAR(B2)の結果: #VALUE!  入力した日時: 2012/11/5 21:43 =YEAR(B5)の結果: 2012  Excel に入力した ISO 8601形式の日時は、 文字列として認識されている
Excel に ISO 8601形式の日時を入力した例

入力した日時: 2012-11-05T21:43:00.004+09:00
=YEAR(B2)の結果: #VALUE!

入力した日時: 2012/11/5 21:43
=YEAR(B5)の結果: 2012

Excel に入力した ISO 8601形式の日時は、
文字列として認識されている

Google Drive SpreadSheet に ISO 8601形式の日時を入力した例  入力した日時: 2012-11-05T21:43:00.004+09:00 =YEAR(B2)の結果: #VALUE!  入力した日時: 2012/11/05 21:43:00 =YEAR(B5)の結果: 2012  エラー: 関数 YEAR のパラメータ 1 の値 は 数値 にしてください。テキスト が「2012-11-05T21:43:00.004+09:00」になっているので、数値 にできません。  Google Drive SpreadSheet  に入力した ISO 8601形式の日時は、 文字列として認識されている
Google Drive SpreadSheet に ISO 8601形式の日時を入力した例

入力した日時: 2012-11-05T21:43:00.004+09:00
=YEAR(B2)の結果: #VALUE!

入力した日時: 2012/11/05 21:43:00
=YEAR(B5)の結果: 2012

エラー: 関数 YEAR のパラメータ 1 の値 は 数値 にしてください。テキスト が「2012-11-05T21:43:00.004+09:00」になっているので、数値 にできません。

Google Drive SpreadSheet  に入力した ISO 8601形式の日時は、
文字列として認識されている

ここでは、セル B2 に入力した ISO 8601 形式の日時が、ソフトウェア側では文字列として認識されているため、YEAR(B2) の結果が、エラーとなっています。
(通常、YEAR 関数の引数には、日時のシリアル値を指定します。)

セル B5 に入力した、ソフトウェア側が日時と認識できるデータは、YEAR(B5) の結果が正常に得られています。


ISO 8601形式の日時を、Excel や Google Drive SpreadSheet で日時として認識させるには、次のような形式で入力します。

ISO 8601形式の日時:
2012-11-05T21:43:00.004+09:00

Excel や Google Drive SpreadSheet で日時として認識させることのできる形式(一例):
2012-11-05 21:43:00.004


JavaScript で、ISO 8601形式の日時をExcelやGoogle Drive SpreadSheetで認識可能な形式に変換

そのような ISO 8601形式の日時を、Excel や Google Drive SpreadSheet で日時として認識させるための変換は、Excel 上で手入力や Excel 関数、VBA などを使用して行っても良いのですが、Web ページ上で表示しているデータの場合、JavaScript で変換しておくという手段もあります。

そこで、ISO 8601形式の日時を入力として、"4桁の年/1-2桁の月/1-2桁の日 1-2桁の時:1-2桁の分:1-2桁の秒"という形式の日時のテキストを戻り値とする、ISO8601toDateTimeStringという関数を作成しました。

ソースコード:

<script type="text/javascript">
<!--

    /* 
     ISO8601形式の日時のテキストから、
     ExcelやGoogle Drive SpreadSheetで認識可能な日時を生成する

    引数:
     iso8601String : ISO8601形式の日時のテキスト

    戻り値:
     次の形式の日時のテキスト
      4桁の年/1-2桁の月/1-2桁の日 1-2桁の時:1-2桁の分:1-2桁の秒

    */
    function ISO8601toDateTimeString(iso8601String) {

        var date = new Date(iso8601String);

        return date.getFullYear() + "/" +
            (date.getMonth() + 1) + "/" +
            date.getDate() + " " +
            date.getHours() + ":" +
            date.getMinutes() + ":" +
            date.getSeconds();
    }

    var text = "2012-11-05T21:43:00.004+09:00";
    document.write("text = " + text + "<br />");
    document.write("date = " + ISO8601toDateTimeString(text) + "<br />");

//-->
</script>


実行結果:

text = 2012-11-05T21:43:00.004+09:00
date = 2012/11/5 21:43:0

このように、ISO 8601形式の日時(2012-11-05T21:43:00.004+09:00)を元にして、"4桁の年/1-2桁の月/1-2桁の日 1-2桁の時:1-2桁の分:1-2桁の秒"という形式の日時のテキスト(2012/11/5 21:43:0)が得られていることが分かります。


なお、現在お使いのブラウザにおける実行結果を次に示します。

お使いのブラウザにおける実行結果:


解説

ここでは、Date オブジェクトを利用して、ISO 8601形式の日時のテキストを解析しています。

Date - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date


なお、次のページの「ブラウザによる相違 - Date.parse()による解析の成否 表」に記載されているように、ブラウザによっては、ISO 8601形式の日時のテキストを認識できないケースがあるので注意が必要です。

Dateオブジェクト (日付と時刻) | JavaScript プログラミング解説


さて、Date オブジェクトを使用して日時を解析しているので、Date オブジェクトの toLocaleString メソッドなどの、日時を文字列に変換する機能を使用すれば、ExcelやGoogle Drive SpreadSheetで認識可能な形式に変換出来るのではないかという淡い期待を初めは持っていました。

しかし、次のページの「文字列による取得 (to...String) - ブラウザによる相違」が示すように、Date オブジェクトの toLocaleStringメソッドなどの、日時を文字列に変換する機能は、ブラウザによって大きく返す日時の形式が異なります。

Dateオブジェクト (日付と時刻) | JavaScript プログラミング解説
文字列による取得 (to...String)
http://so-zou.jp/web-app/tech/programming/javascript/grammar/object/date.htm#no3


残念ながら、ExcelやGoogle Drive SpreadSheetで認識可能な形式にならないブラウザがあるため、次のように年や月などを個別に取り出し、日付の形式に自力でフォーマットすることにしました。

        return date.getFullYear() + "/" +
            (date.getMonth() + 1) + "/" +
            date.getDate() + " " +
            date.getHours() + ":" +
            date.getMinutes() + ":" +
            date.getSeconds();


なお、ミリ秒はこの例では付与していませんが、必要ならばミリ秒を付与するようにコードを修正してみてください。


Excel や Google Drive SpreadSheet で認識可能か確認

さて、上記で変換した日時が、Excel や Google Drive SpreadSheet で認識可能か確認しました。

Excel のセルに "2012/11/5 21:43:0" を入力した結果 日時として認識されている
Excel のセルに "2012/11/5 21:43:0" を入力した結果
日時として認識されている

Google Drive SpreadSheet のセルに "2012/11/5 21:43:0" を入力した結果 日時として認識されている
Google Drive SpreadSheet のセルに "2012/11/5 21:43:0" を入力した結果
日時として認識されている


セル B2 に入力した "2012/11/5 21:43:0" が、セル B3 に入力した YEAR(B2) 関数によって正常に処理されています。


以上のように、Excel、Google Drive SpreadSheet 共に、日時として認識させることが出来ました。





関連記事

関連記事を読み込み中...

同じラベルの記事を読み込み中...