[JavaScript]日付をyyyymmddhhmmの形でDate↔︎stringに変換するのが結構面倒でした

JavaScript
スポンサーリンク

ちょっと訳あって、日付をyyymmddhhmm形式で扱うことになりました。
“2022年2月5日 21:00″の場合、”202202052100″になる感じです。

Dateの引数にそのまま突っ込んでもダメです。

const date = new Date('202202052100'); //Invalid Date(無効な日付)になるのでダメ!!

少し工夫してあげる必要があります。

string(文字列)→Date(日付)

分割すればOK

const str = '202202052100';
const year = parseInt(str.substring(0, 4));               //2022
const month = parseInt(str.substring(4, 6));              //2
const day = parseInt(str.substring(6, 8));                //5
const hour = parseInt(str.substring(8, 10));              //21
const min = parseInt(str.substring(10, 12));              //0
const date = new Date(year, month - 1, day, hour, min);   //monthは0オリジン

かなり面倒ですが、年月日時間分でそれぞれ切り取って数値としてDateに渡すと変換できます。

monthだけ-1にしているのは、Dateのmonthが0オリジンだからです。

  • 1月→0
  • 2月→2
  • 12月→11

0から始まるので、1つ引いてあげます。

日付の文字列がUTCだった場合

文字列の日付がUTCの値であった場合は、年月日時間分をそれぞれ引数としてDateに渡すとタイムゾーンのオフセット分ずれます。対処としては、次の二つがあるかなと思います。

対処1. オフセット分を引く
const utcDate = new Date(year, month - 1, day, hour, min); //UTCの場合、オフセット分ズレる
const offset = new Date().getTimezoneOffset() * 60 * 1000; //タイムゾーンオフセットを取得
const currentDate = new Date(utcDate.getTime() - offset); //オフセットを引いて調整
対処2. DataにISO形式の文字列で渡す
const str = '202202052100';
const year = str.substring(0, 4);  //2022
const month = str.substring(4, 6); //02
const day = str.substring(6, 8);   //05
const hour = str.substring(8, 10); //21
const min = str.substring(10, 12); //00
const isoString =
    year + '-' + month + '-' + day + 'T' + hour + ':' + min + ':00.000Z';
const date = new Date(isoString); //ISO形式の文字列で引数に渡す(2022-02-05T21:00:00.000Z)

Date(日付)→string(文字列)

方法1:ISO形式の文字列から成形

const date = new Date();
const str = date
            .toISOString()           //2022-02-05T21:00:00.000Z
            .replace(/[^0-9]/g, '')  //20220205210000000
            .slice(0, -5);           //202202052100

ISO形式(YYYY-MM-DDTHH:mm:ss.sssZ)の文字列にして、いらない箇所を切り取ります。

  1. toISOString():ISO形式の文字列を取得
  2. replace(/[^0-9]/g, ”):正規表現で数値以外を切り取る
  3. slice(0, -5):末尾の秒数を削除

正規表現の詳細はこんな感じ。

  • [^0-9]:0~9以外の文字列
  • /g: 繰り返して全部チェック

これで、数値以外全てにヒットします。

方法2:文字列を連結させる

const pad2 = (n) =>  { return n < 10 ? '0' + n : n }
const date = new Date();
const str = date.getFullYear().toString() 
       + pad2(date.getMonth() + 1) 
       + pad2(date.getDate()) 
       + pad2(date.getHours())
       + pad2(date.getMinutes()) 
       + pad2(date.getSeconds());

年月日時間分をそれぞれ取得して、文字列をつなげています。

月日時間分は2桁になるので、10よりも小さい場合は頭に’0’を加えます。

monthは0オリジンなので、注意してください(1を足します)

余談

少しコードの記述量が多くなっちゃいますね。
気になる場合はライブラリを導入してもいいかも。

コメント

タイトルとURLをコピーしました