Reactを始めて、初めてJavaScriptを触った私が、JavaScriptでのDateTime型のフォーマットの変更の際にどう躓いたのでその方法をまとめました。
やりたいこと
createdAt: “2021-12-16T00:38:02.846Z”
デフォルトでこのような表示となっているものを以下のフォーマットに変更したい。
createdAt: “2021-12-16”
変更というか、日付だけのデータにしたい。
日付だけのデータにしたいのであれば、データ型をAWSDateにすればいいのではといえばそれまでですが、Datetimeで取得したいけど、ある部分の表示ではDateだけにしたい!といったことってありますよね!!
やってみた
いろいろ調べてみて、以下の記法にたどり着き、これでやってみました。
for(let i in list){
const li = list[i]
li['createdAt'] = dc(li.createdAt);
}
function dc(date){
const year = new Date(date).getFullYear();
const month = new Date(date).getMonth();
const day = new Date(date).getDate();
return year+"-"+month+"-"+day
}
配列のlistを展開して、展開した値を変数liとして定義。
その取り出した値の中のcreatedAtに対し、関数dcを実行して、新たなcreatedAtを作成。
こうすると、なぜか以下の結果となりました!
AWSDateTimeの値: “2021-12-16T00:38:02.846Z”
変換後の値: ”2021-11-16″
月が一ヶ月遡る!なぜ!?
この問題を解決します!
修正
まずは、new Date(date)が冗長なので変数にまとめます。
一桁の月日の場合、0が付くよう00ベースとし、sliceを使って後ろの2文字を取得する。
月は超単純に+1します。
なぜ+1なのか?常に+1で良いのか疑問が湧くところですよね。
結論は、常に+1で良いです。
なぜかというと、monthは0が起点であり、1月ならば0、12月ならば11でOKなのです。
これらを踏まえて、最終的に以下のようになりました!
function dc(date){
const dt = new Date(date)
const year = dt.getFullYear();
const month = ("00" + (dt.getMonth()+1)).slice(-2);
const day = ("00" + dt.getDate()).slice(-2);
return year+"-"+month+"-"+day
}
結果は
createdAt: “2021-12-16”
見てくれてありがとうございました!
コメント