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

クラウディア 
1. 概要
2. time
3. datetime
4. ロケール・文字列への変換
5. 時刻差
6. 文字列からの変換

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.0008854866027832
 出力を見ると、結構、制度が細かいのであろうことが想像されます。

3. datetime

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

now = datetime.datetime.now()

print(now)
print(now.strftime('%Y年%m月%d日(%a) %H:%M:%S'))
 上記のソースを実行すると、下記の結果が得られます。
2025-07-13 17:01:47.604775
2025年07月13日(Sun) 17:01:47
 ここで、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'))

 上記のソースを実行すると、下記の結果が得られます。
('C/C', 'UTF-8/C/C/C/C')
('ja_JP', 'UTF-8')
2025-07-13 17:01:47.682660
2025年07月13日(日) 17:01:47
2025年07月13日(日) 午後 05:01:47
2025/07/13(日曜日) 17時01分47秒
 「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」
%z UTCオフセット (空文字列), +0000, -0400, +1030, +063415, -030712.345216

 「%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.000091

6. 文字列からの変換

 日時型から文字列への変換を前の方でやりましたが、今度はその逆。  本サイトで、コンテンツ内に。

<meta name="date" content="2021-06-24T10:25:32+0900">
 てな記述をしております。  これを逆に、「datetime」型へ変換したいと思いましてな。  これは「strptime」ちゅうのを使うらしい。  基本形は。

日時 = strptime(文字列, 書式)
 らしい。  てことで、下記のソースを書きました。
import datetime

mydatetime = datetime.datetime.strptime('2021-06-24T10:25:32+0900', '%Y-%m-%dT%H:%M:%S%z')
print(mydatetime.strftime('%Y年%m月%d日 %H:%M:%S'))

 上記のソースを実行すると、下記の結果が得られます。
2021年06月24日 10:25:32
 意図通りの結果が得られました。
earthcar(アースカー)