date-fnsでUTCの文字列をJSTのDateに変換する(yyyy-MM-dd HH:mm)

JavaScript
スポンサーリンク

日時がUTCになっている文字列をJavaScriptのDateオブジェクトに変換してみます。

ライブラリにはdate-fnsを使用しました。

parseでDateオブジェクトに変換するだけでは、TimezoneOffset分ずれてしまいます。

注意が必要です。

date-fnsのインストール方法

npm i date-fns
yarn add date-fns

UTCの文字列からDateオブジェクトに変換

import { parse, subMinutes } from 'date-fns';

const convertUtcStr2JstDate = (str, format) => {
  const utcDate = parse(str, format, new Date());
  return subMinutes(utcDate, utcDate.getTimezoneOffset());
};

const utcStr = '2022-02-08 00:00';
const format = 'yyyy-MM-dd HH:mm';

const jstDate = convertUtcStr2JstDate(utcStr, format);

console.log(jstDate.toString()); //Tue Feb 08 2022 09:00:00 GMT+0900 (日本標準時)

ただ単にparseをしただけでは、日付の文字列が現地時間として処理されます。

その場合、TimezoneOffsetの分だけ値がずれてしまいます。

そこで、subMinutesでオフセット分を引いてあげています。

const utcStr = '2022-02-08 00:00';
const format = 'yyyy-MM-dd HH:mm';

//GMT+0900が追加されてしまう
const utcDate = parse(str, format, new Date());
console.log(utcDate);
//Tue Feb 08 2022 00:00:00 GMT+0900 (日本標準時)

//9時間の差を引いて調整する(JSTのTimezoneOffsetはマイナス)
const jstDate = subMinutes(utcDate, utcDate.getTimezoneOffset()) 
console.log(jstDate);
//Tue Feb 08 2022 09:00:00 GMT+0900 (日本標準時)

実際には、JSTのTimezoneOffsetはマイナスになるので、UTCに9時間足すことになります。

使った関数ちょっと説明

parse(dateString, formatString, referenceDate, [options])

文字列をフォーマットに従ってDateオブジェクトにします。

使い方はこんな感じ

// 02/11/2014をフォーマットMM/dd/yyyyで解析
const result = parse('02/11/2014', 'MM/dd/yyyy', new Date())
//=> Tue Feb 11 2014 00:00:00
subMinutes(date, amount)

Dateオブジェクトから指定した分数引いて、その結果をDateオブジェクトで返します。

// 2014/06/10 12:00:00から30分引く
const result = subMinutes(new Date(2014, 6, 10, 12, 0), 30)
//=> Thu Jul 10 2014 11:30:00

以上

コメント

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