コンテンツにスキップ
地震や土砂災害、海上輸送の影響で一部地域に配送遅延が出ている可能性があります。心当たりのある地域にお住まいの方は、こちらから詳細をご確認ください。
大雪や地震、土砂災害、海上輸送の影響で一部地域に配送遅延が出ている可能性があります。心当たりのある地域にお住まいの方は、こちらから詳細をご確認ください。
Pythonのstrftimeメソッドの実行環境依存の小話

Pythonのstrftimeメソッドの実行環境依存の小話

こんにちは。
ECシステム開発チームのいまづです。

今日は、あれ?そうだったのか、と思ったPythonの小ネタを。

datetime.strftimeメソッドの書式の実行環境依存

datetime.datedatetime.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 での注意 のところに、- について書いてありました。

glibc_での注意

なるほどー。

実際にdateime.datestrftimeメソッドで 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月'

と書くほうが無難ですかね。

ということで、ドキュメントに書かれていない場合は、プラットフォームに注意が必要ですね、という小話でした。

 

 


 

システムエンジニア募集中です!

興味のある方はぜひカジュアル面談へ!お待ちしています。

前の記事 Gargamel Can't Catch These BlueSMiRFs!
次の記事 リアルイベントやります!【スイッチサイエンス 年度末大感謝祭 / オフィスツアー】