H:i:s って何?
◆ PHP でしか使われてないフォーマット
◆ (有名な言語いくつか調べた限り)
◆ (有名な言語いくつか調べた限り)
PHP で時刻をフォーマットするとき
PHP で時刻を文字列で取得するときのコードはこういうものですphp > echo date("Y/m/d H:i:s");
2020/02/19 09:38:33
H:i:s ってなんなんでしょう
H と s はいいのですが なぜ minute が i になるのでしょうか
m は month とかぶるので m(i)nute ?
すごくコレジャナイ感があります
他の言語を見てみる
どうせ PHP のことです独自路線で他言語では使われない書き方をしてるのでしょう
とは思ったもののもしかしたら使われてるかもしれないので 有名どころの言語をいくつか見てみました
JavaScript
JavaScript には時刻をフォーマット指定で出力する機能はありません日本のロケールなら toLocaleString を使えばそれっぽくでます
ただし 桁が足りなくても 0 埋めされないので縦に並べて揃えたいときには向いていません
よく使われる日付ライブラリの moment.js を使うとこうなります
moment().format("YYYY/MM/DD HH:mm:ss")
// "2020/02/19 18:15:19"
桁数に合わせて YYYY/MM のようになっています
ちなみに私の場合は 日付のフォーマットや足し算したいくらいで moment.js ロードしたくないのでフォーマット関数は自作してます
その場の気分で多少変わるものの基本このフォーマットです
date.format(new Date(), "yyyy/MM/dd HH:mm:ss")
基本小文字なのですが 被る month と minute は先の方の month を大文字にしてます
H は多くの場所で使われてる 24h 表記と 12h の違いで大文字が 24h 表記です
.NET
.NET での書き方は 私が JavaScript で作ってるのと同じでしたC# はこうなります
> DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")
"2020/02/19 17:51:23"
特に C# の書き方を元にした記憶はないですが 基本は小文字で桁数分のアルファベットを書くという考え方で作れば自然なものに思います
F# も .NET なので同じです
> System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");;
val it : string = "2020/02/19 17:54:21"
VB は略します
JVM
JVM は .NET と同じでしたC# が Java を元にしてる以上自然なものでしょう
Kotlin と Scala で書いていますが どちらも Java の機能で同じものを使ってます
Kotlin
>>> import java.text.SimpleDateFormat
>>> import java.util.Date
>>> SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Date())
res11: kotlin.String! = 2020/02/19 18:33:13
Scala
scala> import java.text.SimpleDateFormat
import java.text.SimpleDateFormat
scala> import java.util.Date
import java.util.Date
scala> new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date())
res0: String = 2020/02/19 18:35:02
Linux
プログラミング言語に限らず linux のコマンドでもできたなと思って調べてみました~> date "+%Y/%m/%d %H:%M:%S"
2020/02/19 17:58:17
+ は date コマンドのオプションとして必要なものです
PHP と似てはいるものの % が必要で 分は %i ではなく %M になっています
.NET などとは month と minute でどっちが大文字かが逆です
%i はあるのだろうかと調べてみると %I オプションはありました
時刻の 12 時間表記で 分とは関係なかったです
%H 時 (00..23)
%I 時 (01..12)
Python
Python は Linux と同じでした>>> datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
'2020/02/19 18:00:58'
strftime というのが C 言語にある関数で それを使ってそうです
datetime の strftime ではフォーマットした上でビルトインモジュールの time の strftime 関数を呼び出していました
「help(time.strftime)」 をみると C ライブラリの strftime 関数を見てくださいって最後に書いてました
Ruby
Ruby も Python や Linux と同じ strftime 関数でしたirb(main):013:0> DateTime.now.strftime("%Y/%m/%d %H:%M:%S")
=> "2020/02/19 18:06:25"
他
Perl や Rust は JavaScript と同じく標準には無いようでした準備が面倒だったので動かしてません
PHP 独自みたい
調べた限りだと PHP と一緒はありませんでしたJVM/.NET 系と Linux 系で別れていたものの みんなバラバラじゃなくて共通なフォーマットがあるようでした
Linux 系は短いものの % が面倒なので JVM/.NET 系の書き方のほうが好きです
文字数がそのまま桁数なので結果のイメージがつかみやすいです
PHP 記法だと % すらないので短さ最優先みたいです
他に使うのは記号のみで一般的なテキストの途中に入れることは想定してないようです
Hello が 「20Asia/TokyoSundaySunday2020」 になるくらいですから
これはこれで不便だと思ったら PHP にも strftime がありました
あまり使われてるのは見ないですけど
php > echo strftime("%Y/%m/%d %H:%M:%S");
2020/02/19 09:40:13
PHP だけ使ってる人でもないならこっちのほうが慣れている書き方で書けるのでいいかもしれませんね
使ってる言語がわかるかも
今回調べたきっかけはネットで見かけた H:i:s を時刻フォーマットで当たり前のように使ってる人を見たことですPHP でしか見ないと思ってたような書き方を PHP の解説でもないところで当たり前のように使ってるので 実は PHP に限らずその他の有名どころでも使われてる書き方だったりするのかなと思って調べてみました
いくつか知名度の高い言語を見た感じでは PHP だけの書き方というのがわかりましたが ついでに JVM/.NET 系と Linux でも別れてることがわかりました
日付フォーマットの書き方でその人がどういう言語を普段使ってるかわかるかもしれませんね
追記:JavaScript の標準フォーマット
JavaScript では標準のフォーマット機能がなく Moment は他にない特殊な記法でしたですが <input type="datetime-local"> を使う場合はフォーマットがありました
value に適当な文字列を指定すると warning で
The specified value "a" does not conform to the required format. The format is "yyyy-MM-ddThh:mm" followed by optional ":ss" or ":ss.SSS".
とメッセージが出ます
yyyy-MM-ddThh:mm:ss.SSS
.NET 系と同じタイプですね
しかし 注目するのはミリ秒です
「SSS」となっていますが .NET のフォーマット指定では小数点以下の秒の f または F です
f と F の違いは 0 の場合に表示するかどうかで 7 桁まで書くことができます
S は使われません
Java の SimpleDateFormat ではミリ秒を SSS と書くのでこっちと同じようです