以下の内容はhttps://let.blog.jp/tag/Dateより取得しました。


undefined を渡すのと渡さないので動きかえるのどうにかしてほしい
最近 JavaScript の変な仕様をそろそろどうにかしてほしいみたいなことを書いてましたがそのひとつ
引数を渡さなければ undefined となるのが基本的な動作なのに明示的に undefined を渡すときと省略したときで動きが違う関数があります

console.log(new Date())
// Thu Mar 17 2022 22:39:45 GMT+0900 (日本標準時)
console.log(new Date(undefined))
// Invalid Date

わざわざ undefined なんて渡さないと言っても 実際には変数に入ってるのが undefined なのでけっこうあります
例えば

const fn = date_str => {
const date = new Date(date_str)
// ...
}

fn("2022/01/01")
fn()

引数を渡さなければデフォルトで今の時刻であることを期待してるのに Invalid Date になるというのはよくあるミスです
これの対処のために

const fn = date_str => {
const date = date_str == null ? new Date() : new Date(date_str)
// ...
}

と書かないといけないというのは不満しかないです
... を使って配列を引数に展開できるので

const fn = date_str => {
const date = new Date(...(date_str == null ? [] : [date_str]))
// ...
}

と書いても動きますが 読みやすいとは言えません

const fn = (...a) => {
const date = new Date(...a)
// ...
}

とするとよりスッキリはしますが 引数を見て何を受け取るのかわかりづらいです
可変長引数である意味はないですし 他にも引数が必要な関数だと面倒が増えます

Date の場合はデフォルトが現在日時なので それをデフォルト引数とするという方法も取れます

const fn = (date_str = new Date().toString()) => {
const date = new Date(date_str)
// ...
}

引数を書くところがごちゃごちゃしてきます
Date コンストラクタの引数のところで書くほうがいいかもしれません

const fn = date_str => {
const date = new Date(date_str ?? new Date())
// ...
}

どっちにしても デフォルト値を別に作るために new Date() を余分に呼び出すことになってますし 気持ちの良い解決策とは言えないです

Date が undefined を渡した場合に引数無しと同じ動きとなってればこんな問題は起きないんですけどね
Date に関していえば早く Temporal が実装されて Date 型を使わなくて良くなってほしいです
お手軽に日付フォーマットする
よく使う日付フォーマット yyyy-MM-dd HH:mm:ss (yyyy/MM/dd でも可)
JavaScript だと簡単に作れない
このフォーマットだけならライブラリ入れるほどでもないけど 毎回作るのも面倒

toLocaleString はいい感じだけど 0 でパディングされない
ログみたいに上下に時刻を並べると 5 月や 9 時みたいな 1 桁のところでずれる

単純な置換でやってみる

◯ toISOString を使う (- 区切り)

UTC になるので JST 分 9 時間足しておく
ミリ秒や T はいらないので削除

const date = new Date()

const d = new Date(date)
d.setHours(d.getHours() + 9)
console.log(d.toISOString().split(".", 1)[0].replace("T", " "))

◯ toLocaleString を使う (/ 区切り)

1 桁のところを padding すればよいので 1 桁数字に 0 をつけるだけ

const date = new Date()

console.log(date.toLocaleString().split(/([^\d])/).map((x, i) => i % 2 === 0 && x.length === 1 ? "0" + x : x).join(""))

置換でもいいかも

const date = new Date()

console.log(date.toLocaleString().replace(/\d+/g, x => x.length === 1 ? "0" + x : x))
Date 型のフォーマット
Date 型を yyyy/MM/dd みたいにフォーマット指定で文字列化したい時のためのコード

Date.prototype.format = function(format) {
const zeroPad = (len, str) => String(str).padStart(len, "0")
const p = zeroPad.bind(null, 2)
const replacement = {
yyyy: this.getFullYear(),
MM: p(this.getMonth() + 1),
dd: p(this.getDate()),
HH: p(this.getHours()),
mm: p(this.getMinutes()),
ss: p(this.getSeconds()),
fff: zeroPad(3, this.getMilliseconds()),
}
return format.replace(new RegExp(Object.keys(replacement).join("|"), "g"), e => replacement[e])
}
new Date().format("yyyy/MM/dd HH:mm:ss.fff")
// "2018/03/02 19:00:11.780"


高機能化 (C# や PHP を参考にしてる)
Date.prototype.format = function(format) {
const zeroPad = (len, str) => String(str).padStart(len, "0")
const p = zeroPad.bind(null, 2)
const sign = n => (~~n < 0 ? "-" : "+")
const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
const apm = ["AM", "PM"]
const v = {
y: this.getFullYear(),
M: this.getMonth() + 1,
d: this.getDate(),
H: this.getHours(),
m: this.getMinutes(),
s: this.getSeconds(),
f: this.getMilliseconds(),
w: this.getDay(),
u: this.getTime(),
o: -this.getTimezoneOffset(),
}
const replacement = {
yyyy: v.y,
yy: p(v.y % 100),
MMMM: months[v.M - 1],
MMM: months[v.M - 1].substr(0, 3),
MM: p(v.M),
M: v.M,
dddd: days[v.w],
ddd: days[v.w].substr(0, 3),
dd: p(v.d),
d: v.d,
HH: p(v.H),
H: v.H,
hh: p(v.H % 12),
h: v.H % 12,
mm: p(v.m),
m: v.m,
ss: p(v.s),
s: v.s,
fff: zeroPad(3, v.f),
f: v.f,
tt: apm[+(v.H >= 12)],
t: apm[+(v.H >= 12)][0],
UU: v.u,
U: parseInt(v.u / 1000),
zzz: sign(v.o) + p(~~(v.o / 60)) + ":" + p(v.o % 60),
zz: sign(v.o) + p(~~(v.o / 60)),
z: sign(v.o) + ~~(v.o / 60),
}
return format.replace(new RegExp(Object.keys(replacement).join("|"), "g"), e => replacement[e])
}
new Date().format("yyyy/MM/dd HH:mm:ss.fff")
// "2018/03/02 19:00:11.780"

"timezone offset: " + new Date().format("zzz")
// "timezone offset: +09:00"

"unixtimestamp: " + new Date().format("U")
// "unixtimestamp: 1519987796"

"unixtimestamp(ms): " + new Date().format("UU")
// "unixtimestamp(ms): 1519987802170"

new Date().format("tt t MMMM MMM dddd ddd")
// "PM P March Mar Friday Fri"



以上の内容はhttps://let.blog.jp/tag/Dateより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14