Pythonのstrftimeメソッドの実行環境依存の小話
こんにちは。
ECシステム開発チームのいまづです。
今日は、あれ?そうだったのか、と思ったPythonの小ネタを。
datetime.strftimeメソッドの書式の実行環境依存
datetime.date
や datetime.datetime
から「2023年8月」といった文字列、08月
じゃなくて8月
な文字列を得たいときって、どう書きますか?
僕はいつごろからか忘れましたが、
>>> from datetime import date
>>> dt = date(2023, 8, 1)
>>> dt.strftime('%Y年%-m月')
'2023年8月'
と書いていました。
普段、Linux上で動かすもの書くことがほとんどなので知らなかったのですが、これだとWindowsで実行するとエラーになるんですね。
>>> dt.strftime('%Y年%-m月')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Invalid format string
そういえば、Pythonのドキュメントに %-m
のような書式については記述がありません。
https://docs.python.org/ja/3/library/datetime.html#strftime-and-strptime-format-codes
timeモジュールのstrftime関数を見てみると、ドキュメントに書いてない書式が使えることがあるって書いてありますね。
https://docs.python.org/ja/3/library/time.html#time.strftime
一部のプラットフォームではさらにいくつかのディレクティブがサポートされていますが、標準 ANSI C で意味のある値はここで列挙したものだけです。あなたのプラットフォームでサポートされている書式コードの全一覧については、strftime(3) のドキュメントを参照してください。
書かれている strftime(3)
のリンク先 を見ると、 glibc での注意 のところに、-
について書いてありました。
なるほどー。
実際にdateime.date
のstrftime
メソッドで strftime(3)
を実行しているコードはここになるのかな。
https://github.com/python/cpython/blob/7ab9efdd6a2fb21cddca1ccd70175f1ac6bd9168/Modules/_datetimemodule.c#L1747-L1748
result = PyObject_CallFunctionObjArgs(strftime, format, timetuple, NULL);
Windowsのドキュメントはこれかな?
確かに -
については書いていないですね。
対応してないプラットフォームのことを考えるなら、
>>> f'{dt.year}年{dt.month}月'
'2023年8月'
と書くほうが無難ですかね。
ということで、ドキュメントに書かれていない場合は、プラットフォームに注意が必要ですね、という小話でした。
システムエンジニア募集中です!
興味のある方はぜひカジュアル面談へ!お待ちしています。