メモ。所詮メモ。

TypeScriptでなんとなく使う方法も書いておく。

◆結論

Z|[+-](0\d|1[012])(:?[012345]\d)?

▼注意

  1. フルのハイフン時刻表記に対してこの正規表現を通すと死ぬ。つまり、「2020-01-01」の「-01」が取れてくるわけだから、注意ですよね。
  2. 「-12:00」でも「-00:00」でもとれる。それが表記的に正しいかどうかはよくわからん。
  3. 「+09」でも「+0900」でも「Z」でも取れちゃうよ。ISO 8601がそういう仕様だからしゃあないね。

「Z」が取れちゃう問題点として、日付を表現してない文字列を処理したときに、その文字列に「Z」が混入してたらTime Zoneだと勘違いして引っ掛けちゃう可能性あるよね。

参考:ISO 8601 | Wikipedia

◆おまけ:読み方

「|」が “または”。

「[]」が “~のうちのひとつ”

「()」が 算数のカッコと同じようなもの。(もっと言うとキャプチャ)

「\d」が数値。(0~9)

「?」が “直前の文字が0回あるいは1回”
→「(hoge)?」だと、「文字列hogeが0回あるいは1回」

◆おまけ:TypeScriptでつかう

割と適当な処理だから、割と適当な文字列を処理したい場合は割と適当厳密にやれや。

  1. 前後の空白をTrimして
  2. 日付の表示部分を一応消して
  3. 「Z」の判定を正規表現の外に出してます。
 
private getOffset(dateTime: string): string {
   const d = dateTime.trim().replace(/\d{4}-\d{2}-\d{2}|\d{4}\/\d{2}\/\d{2}/, '');
   if (d.endsWith('Z')) return 'Z';
   return /[+-](0\d|1[012])(:?[012345]\d)?/.exec(d)?.[0] ?? '';
 }

◆結論

なんかもう体質的に出社しないと仕事できない。リモートマヂ無理。。。OneShotしょ。。。