なにか新しくファイルを作るときには命名法則を考える必要があります。
被らずにソートしやすいものとして日時の情報を使うことが多いですが、どうやって使うのがいいかなと思ったのでjavascriptで適当に動かしてみます。
ロケールタイム
地域時間を使った日時をファイル名に使うことはよくあります。
1 2 |
> new Date().toLocaleString() < "2020/2/9 6:54:19" |
伝統にのっとりDateオブジェクトの関数を使ったり、(実装されていれば)optionsを使ったり、replace
(もしくはsplit&join
)を使うなどして好きなフォーマットにしてファイル名に含めればいいです。
1 2 3 4 5 6 7 8 9 10 11 |
> const padL = e => ("0" + e).slice(-2) > const d = new Date() > padL(d.getHours()) + "-" + padL(d.getMinutes()) + "-" + padL(d.getSeconds()) < 06-54-19 > var options = { month: 'long',hour:"numeric",minute:"numeric",second:"numeric" }; > new Date(1581198859211).toLocaleString("ja-JP",options) < "2月 6:54:19" > new Date().toLocaleString().split(/[\/:]/).join("-") < "2020-2-9 6-54-19" |
Unix時間
1970/1/1 0:00:00から経過した秒数を利用します。
1 2 |
> Date.now() //or new Date().getTime() < 1581198859211 |
javascriptではms単位なので変なことをしなければ被ることはほぼないはず。
13桁の数字で日時を表せます。
桁数が増えるのは2286年なので基本無視していいんじゃないかな。
1 2 |
> new Date(9999999999999) < Sun Nov 21 2286 02:46:39 GMT+0900 (日本標準時) |
2038年問題(jsでは直接関係はないけど)やうるう秒の扱いも心の片隅に。
Unix時間 36進数
36進数は普段は使う機会が少ないですが便利な進数です。
カラーコードなどでよく使うHex(16進法)は(0-9|a-f)
を使いますが、アルファベット全部を使うのが36進法表記(0-9|a-z)
です。
1 2 |
> Date.now().toString(36) < "k6e4z45n" |
こちらは8桁で表現できますね。
進数表記を増やす(例えば62進法表記(0-9|a-z|A-Z)
など)と文字数を減らせますが、36進以降は処理のお手軽さがなくなりますしソートも考えないといけなくなります。
ちなみにこちらの桁数が増えるのは2059年で微妙ですが、ソートに問題が起きそうなのはずいぶんと後なのでそこまで気にすることもなさそう。
1 2 3 4 5 |
> new Date(parseInt("zzzzzzzz",36)) < Mon May 26 2059 02:38:27 GMT+0900 (日本標準時) > new Date(parseInt("k00000000",36)) < Tue Dec 13 3757 01:49:09 GMT+0900 (日本標準時) |
色々仮定の日時を書いてはいますが、msを捨てる(1/1000にする)判断をするなら全然違う結果になるのでやりたい方法を考えてから再計算したほうがいいです。
new Date(parseInt("zzzzzz",36)*1000)➡2038年末
どれを使うか
ロケールタイムを使って利用者にわかりやすい名前にするのがいいと思います。
内部で使うものにはUnix timeをそのまま使うと利便性が高いし、どうしても短めの名前が欲しい場合には36進数は低コストでよい方法だと思います。
日時が気に入らないならIDを振ったりカウントしていく方法がありますが、最近はあまり見かけない気がします。