小ネタです、JavaScriptで本日の日付をYYYY-MM-DD形式で得るコードは案外面倒です。
本日2023年4月17日なら 2023-04-17
という文字列を得るコードはRubyならTime.now.strftime("%Y-%m-%d")
、Pythonならdatetime.today().strftime("%Y-%m-%d")
(importは省略しました)と簡単に書けますが、JavaScriptでは案外面倒なのです。
追記: いくつかの間違いのご指摘がありましたので修正しました(2023-04-19)。
DeepAIが生成した画像です
いっけん正しいようで間違ったコード
new Date().toISOString().slice(0,10)
new Date()
で本日の日時を取得しますtoISOString()
メソッドは日時データをISO形式の文字列に変換します、例えば2023-04-17T01:52:26.878Z
を戻しますslice(0,10)
メソッドを使い最初の10文字を取り出します、結果2023-04-17
が取得できます。
現在、このブログを書いているのは午前11時なので正しく動いていますが、午前8時に実行すると前日の日付が戻ります。😅
実はこのメソッドの仕様にはには タイムゾーンは常に 0 UTC オフセットになりと書かれているようにUTCエリア(たとえばイギリス *1)以外では正しくない日付を戻します。
*1 : イギリスにはサマータイムがあるのでイギリスでも正しい日付を戻さない事があります。
2013年以前のコード
ネットを検索すると長いコードが出てきます、たとえば以下のようなコードでしょうか(2013年以前なのでES5で書きます)。
var today = new Date();
var year = today.getFullYear();
var month = ("0" + String(today.getMonth() + 1)).slice(-2);
var day = ("0" + String(today.getDate())).slice(-2);
console.log(year + "-" + month + "-" + day);
長いですね! JavaScriptには日時データにフォーマット指定で文字列にするメソッドが無いのです。
ちなみにChatGPT3.5さんに聞いてみたところ、以下のようなコードを教えてくれました、上のコードと似た感じですよね。 padStart()
はES2017で追加された新しめのメソッドですね。
const today = new Date();
const year = today.getFullYear();
const month = String(today.getMonth() + 1).padStart(2, '0');
const day = String(today.getDate()).padStart(2, '0');
const formattedDate = `${year}-${month}-${day}`;
console.log(formattedDate);
現代のまともなコード
さて、JavaScript(ECMAScript)の国際化APIが設定され、2013年くらいから主要ブラウザーに実装されました。これによりDateオブジェクトにtoLocaleString()
やtoLocaleDateString()
メソッドが追加されました。
このメソッドを使い、new Date().toLocaleDateString('ja-JP')
と書くと、2023/4/17
が戻ります。おしい!
実はこのメソッドにはオプションが指定できるので、
new Date().toLocaleDateString("ja-JP", {year: "numeric",month: "2-digit",
day: "2-digit"})
と書くと 2023/04/17
が戻ります。あと少し!
new Date().toLocaleDateString("ja-JP", {year: "numeric",month: "2-digit",
day: "2-digit"}).replaceAll('/', '-')
と書くと 2023-04-17
が戻ります。やったぁ !!
*2 : replace('/', '-')
は間違いでした
最短のコード(かも)
ネットを調べていたら、Stack Overflowに以下のようなコードが出てきました。
たしかに2023-04-17
が戻ります。❗❗
new Date().toLocaleDateString('sv-SE')
sv-SE
どこ? と思いましたがスウェーデンですね。スウェーデンの日付形式の標準はYYYY-MM-DD
なんですね、素晴らしい!
ただし、このコードを初めて見た人は驚くかもしれませんね、コメントでも書いておくと良いかもしれませんね。
// sv-SEロケールはYYYY-MM-DD形式の日付文字列を戻す
new Date().toLocaleDateString('sv-SE')
*3 : ロケール指定は ‘sv’ や ‘lt’ 等でもYYYY-MM-DDが得られます
終わり。