ちょっと訳あって、日付を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)の文字列にして、いらない箇所を切り取ります。
- toISOString():ISO形式の文字列を取得
- replace(/[^0-9]/g, ”):正規表現で数値以外を切り取る
- 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を足します)
余談
少しコードの記述量が多くなっちゃいますね。
気になる場合はライブラリを導入してもいいかも。
date-fnsで日付変換する方法も記事にしています。
コメント