イントロダクション
日付と時刻を表記する記法として、「ISO 8601」という国際規格があります。
ISO 8601 - Wikipedia
http://ja.wikipedia.org/wiki/ISO_8601
http://ja.wikipedia.org/wiki/ISO_8601
日付 - Wikipedia
http://ja.wikipedia.org/wiki/%E6%97%A5%E4%BB%98
http://ja.wikipedia.org/wiki/%E6%97%A5%E4%BB%98
フォーマットの形式としては、上記の「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形式の日時は、 文字列として認識されている |
ここでは、セル 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オブジェクト (日付と時刻) | JavaScript プログラミング解説
文字列からの生成 (new Date())
http://so-zou.jp/web-app/tech/programming/javascript/grammar/object/date.htm#no2
http://so-zou.jp/web-app/tech/programming/javascript/grammar/object/date.htm#no2
しかし、次のページの「文字列による取得 (to...String) - ブラウザによる相違」が示すように、Date オブジェクトの toLocaleStringメソッドなどの、日時を文字列に変換する機能は、ブラウザによって大きく返す日時の形式が異なります。
Dateオブジェクト (日付と時刻) | JavaScript プログラミング解説
文字列による取得 (to...String)
http://so-zou.jp/web-app/tech/programming/javascript/grammar/object/date.htm#no3
文字列による取得 (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" を入力した結果 日時として認識されている |
Google Drive SpreadSheet のセルに "2012/11/5 21:43:0" を入力した結果 日時として認識されている |
セル B2 に入力した "2012/11/5 21:43:0" が、セル B3 に入力した YEAR(B2) 関数によって正常に処理されています。
以上のように、Excel、Google Drive SpreadSheet 共に、日時として認識させることが出来ました。
コメントを投稿
コメント投稿機能について