◆ 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 と書くのでこっちと同じようです