なんでもかんでもUTCで書いてくる
最近知ってびっくりしたんだけど、JavaScriptって直接的にフォーマットを決めて日時を文字列化することはできないらしい。
もちろんそういうライブラリもあるんですけどね。
システム間で日時をやりとりするときに使われるのがこの形式の文字列なのですが。
date.toISOString() –> "2021-02-06T14:39:03.419Z"
これ取得したのは23時台なんだけど、14時? って見える。
でも、そうじゃないんですよ。ポイントは文字列の最後に付いた"Z"ですね。
これでUTCであることを表している。日本標準時はUTC+9だから、9時間足せば23時39分だね。
詳しく言うとこれはISO 8601形式で、この形式にはいろいろ書き方があって、
このBlogのRSSでは"2021-02-05T23:10:00+09:00"という形で書いている。
この+09:00でこの日時はUTC+9で書かれたことを表している。
ただ、これは本質的には"2021-02-05T14:10:00Z"と同じものである。
こう言われるとJavaScriptが賢いのかアホなのかよくわからないが、多分アホだと思う。
とはいえ、時間は世界中どこでも同じものであって、どこから見るかによって変わるというのも正論ではある。
基本的にJavaScriptの用途からしてみれば、動作しているシステムのタイムゾーンで表示できればよいわけだが、
どこで動いてもシンガポール時刻で表示したいみたいなニーズもあるかもしれない。
そこでJavaScriptの比較的新しい機能(といっても2013年ごろにはあったらしい)として、Intl.DateTimeFormat というのがある。
Intl.DateTimeFormat (MDN Web Docs)
fmt=new Intl.DateTimeFormat('ja-JP',
{timeZone:"Asia/Singapore", year:"numeric", month:"2-digit",
day:"2-digit", hour12:false, hour:"2-digit", minute:"2-digit"});
fmt.format(date);
これでさっきの日本時刻で23:39を表していたデータを食わせると、"2021/02/06 22:39"というのが返ってくる。
year:"numeric"とかいうのは、表示する要素の表示方法をせっせと指定してるんですね。
これは時間帯だけではなく、どの言語の表記を使うかというのも選んでいるので、
"ja-JP"の部分を"de-DE"にすると"06.02.2021, 22:39"というドイツ式の表記で出てくる。
順番もそうだけど(ヨーロッパでは日→月→年が多い)、区切り文字も変わるんですね。
あと、month:"long"とかすると、"06. Februar 2021"のような表記になる。ドイツ語の2月ってそういう表記でしたね。
曜日とか和暦とかも扱えるみたいだが、なかなかクセの多いものに見える。
まぁどうしてこういうこと書いたかって、Power Automationで何にも考えずに作るとUTC表記だらけになったからなんですけどね。
確かにクラウド上で実行するということは、どこで実行しているかタイムゾーンを決めることが難しい。
するとUTCということにされてしまいがちだと。(もちろんそれは最初に書いたようにZ付きの表記であることは多い)
なので意図的にタイムゾーンを変換する処理を入れたりとか、そういうことが必要になるわけですね。
JavaScriptがこうというのは直接的な原因ではないんだけど、間接的には関係ありそうなので。
クラウド時代には実行されている地域のタイムゾーンによるとしては意図した結果が得られないことがあり、
そういうことを回避するためにはそのための処理を入れないといけないというわけ。
Power Automationではタイムゾーン変換を行う処理ブロックがあるので、それで違和感がないタイムゾーンに変換することになる。
あと、Power Automationから呼び出せるExcelScriptでは、日時の処理は基本的にJavaScriptと同じなので、Intl.DateTimeFormatでやることになる。
実はそういうところで調べたのがこれだと。ブラウザで動くJavaScriptはここまで考えることは少ないと思う。
Author : Hidemaro
Date : 2021/02/06(Sat) 23:53
コンピュータ・インターネット | Comment | trackback (0)