Python - 文法 - 日時・ロケール

 クラウディア
1. 概要
2. time
3. datetime
4. ロケール
5. 時刻差

1. 概要

 まずいな、このページ、あちこちに「sleep」をいれたもんだから、表示するのに無駄に時間がかかってしまっている。  日時を表すには、「float」型の「time」と日時オブジェクトの「datetime」があるらしい・・・。  本項は、下記の記事を参考にさせていただきました。
time --- 時刻データへのアクセスと変換 — Python 3.8.3 ドキュメント」
「Python で現在時刻・日付・日時を取得 | note.nkmk.me」
「Python で日付から曜日や月を文字列(日本語や英語など)で取得 | note.nkmk.me」
「処理を一時停止!Python で sleep を使う方法【初心者向け】 | TechAcademyマガジン」
「日付フォーマット(datetime⇔文字列) | Python Snippets

2. time

 実は、「sleep」も「time」を「import」することにより、使用できるらしい。
import time

now1 = time.time()

time.sleep(1.0)

now2 = time.time()

print(now2-now1)

 上記のソースを実行すると、下記の結果が得られます。
1.0629432201385498
 出力を見ると、結構、制度が細かいのであろうことが想像されます。

3. datetime

 「datetime」は、より一般的な日時を表現します。  書式変換もライブラリに用意されているようで、
import datetime

now = datetime.datetime.now()

print(now)
print(now.strftime('%Y年%m月%d日(%a) %H:%M:%S'))
 上記のソースを実行すると、下記の結果が得られます。
2020-10-26 03:40:28.116043

 ここで、6行目の「print」が、おそらく出力されていないのではないか。  コマンドラインからの実行時には、出力されるのに?となりますが、ウェブで実行する場合、ロケールが設定されていないからということのようです。

4. ロケール

 ってことで、ロケールの話になります。本来は、ページを分けるべきかもしれませんが、うまい具合に対応すべきこととなりましたので、ここで記述します。  「strftime」のような、ロケールに依存するような関数を使う場合、ロケールを設定する必要があります。  前項のソースに手を入れて
import datetime
import locale

print(locale.getlocale(locale.LC_ALL))

locale.setlocale(locale.LC_ALL, 'ja_JP.UTF-8')
print(locale.getlocale(locale.LC_ALL))

now = datetime.datetime.now()

print(now)
print(now.strftime('%Y年%m月%d日(%a) %H:%M:%S'))
print(now.strftime('%Y年%m月%d日(%a) %p %I:%M:%S'))
print(now.strftime('%x(%A) %X'))

 上記のソースを実行すると、下記の結果が得られます。
(None, None)
('ja_JP', 'UTF-8')
2020-10-26 03:40:28.216246
2020年10月26日(月) 03:40:28
2020年10月26日(月) 午前 03:40:28
2020/10/26(月曜日) 03時40分28秒
 「strftime」に設定する書式の主なものは、下記になります。  他の多くの言語とほぼ同じかと思います。
書式  意味   備考 
%a ロケールの短縮された曜日 「日」「月」...「土」
%A ロケールの曜日 「日曜日」「月曜日」...「土曜日」
%d 月の何日目か 「00」「01」~「31」
%H 時(24時間) 「00」「01」~「24」
%I 時(12時間) 「00」「01」~「12」
%m 「00」「01」~「12」
%M 「00」「01」~「59」
%p ロケールの午前・午後 「午前」「午後」
%s 「00」「01」~「59」
%x ロケールの日付を適切な形式で 「1975/01/01」~「9999/12/31」
%X ロケールの時間を適切な形式で 「00時00分00秒」~「23時59分59秒」
%y 西暦下2桁 「00」「01」~「99」
%Y 西暦4桁 「1975」「1976」~「9999」

 「%X」のロケールの時間を適切な形式で、というのは納得できますが。
 「%x」のロケールの日付を適切な形式でというのは、議論の余地がありそうですな・・・。

5. 時刻差

 「datetime」型は、差を「-」で算出できます。
import datetime
import time

past = datetime.datetime.now()
time.sleep(1.0)

diff = datetime.datetime.now() - past
print(diff)

 上記のソースを実行すると、下記の結果が得られます。
0:00:01.062853
 
 
カウンタバックグラウンド