1. ホーム
  2. python

[解決済み] 日付を通常の書式で印刷するには?

2022-03-22 15:49:53

質問

これは私のコードです。

import datetime
today = datetime.date.today()
print(today)

これは印刷されます。 2008-11-22 というのは、まさに私が欲しいものです。

しかし、これを追加するリストがあるのですが、突然すべてが"wonky"になってしまいました。以下はそのコードです。

import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print(mylist)

これは次のように表示されます。

[datetime.date(2008, 11, 22)]

のような単純な日付だけを取得するにはどうすればよいのでしょうか? 2008-11-22 ?

解決方法は?

理由: 日付はオブジェクトである

Pythonでは、日付はオブジェクトです。したがって、それらを操作するときは、文字列やタイムスタンプではなく、オブジェクトを操作することになります。

Pythonのどんなオブジェクトも、2つの文字列表現を持っています。

  • が使用する通常の表現です。 print を使って取得することができます。 str() 関数を使用します。これは、ほとんどの場合、人間が読みやすい形式であり、表示を容易にするために使用されます。そのため str(datetime.datetime(2008, 11, 22, 19, 53, 42)) は、次のようになります。 '2008-11-22 19:53:42' .

  • オブジェクトの性質(データとして)を表現するために使用される代替表現。これは repr() この関数は、開発中やデバッグ中に、どのようなデータを操作しているのかを知るのに便利です。 repr(datetime.datetime(2008, 11, 22, 19, 53, 42)) では 'datetime.datetime(2008, 11, 22, 19, 53, 42)' .

何が起こったかというと、日付の印刷を行う際に print を使用していました。 str() で、きれいな日付文字列を見ることができました。しかし mylist を使うと、オブジェクトのリストを表示し、Pythonはデータの集合を表現しようとします。 repr() .

How:それをどうしたいのか?

さて、日付を操作するときは、ずっと日付オブジェクトを使い続けましょう。たくさんの便利なメソッドがあるし、PythonのAPIのほとんどは日付がオブジェクトであることを想定している。

表示する場合は str() . Pythonでは、すべてを明示的にキャストするのがよい習慣です。ですから、印刷するときに、日付の文字列表現を得るには str(date) .

最後にもう一つ。日付を印刷しようとすると mylist . 日付を印刷したい場合は、そのコンテナ(リスト)ではなく、日付オブジェクトを印刷する必要があります。

例:リスト内のすべての日付を印刷したい場合。

for date in mylist :
    print str(date)

なお その場合 を省略することもできます。 str() というのも、printがそれを使ってくれるからです。しかし、それが習慣になってはいけません :-)

あなたのコードを使った実用的なケース

import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print mylist[0] # print the date object, not the container ;-)
2008-11-22

# It's better to always use str() because :

print "This is a new day : ", mylist[0] # will work
>>> This is a new day : 2008-11-22

print "This is a new day : " + mylist[0] # will crash
>>> cannot concatenate 'str' and 'datetime.date' objects

print "This is a new day : " + str(mylist[0]) 
>>> This is a new day : 2008-11-22

高度な日付の書式設定

日付はデフォルトで表現されますが、特定のフォーマットで表示したい場合もあります。そのような場合は、カスタム文字列表現として strftime() メソッドを使用します。

strftime() は、日付をどのようにフォーマットしたいかを説明する文字列パターンを期待します。

例:

print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'

の後の文字はすべて "%" は何かの形式を表しています。

  • %d は日数(2桁、必要に応じて先頭に0を付ける)です。
  • %m は月番号(2桁、必要に応じて先頭に0を付加)です。
  • %b は月の略称(3文字)です。
  • %B は完全な月名(文字)です。
  • %y は年号の省略形(下2桁)です。
  • %Y は完全な年号(4桁)です。

などです。

公式ドキュメントを見る または マカッチェンのクイックリファレンス 全部を知ることはできない。

から PEP3101 すべてのオブジェクトは、任意の文字列のメソッドフォーマットで自動的に使用される独自の形式を持つことができます。datetimeの場合、その書式は strftimeです。ですから、上記と同じように次のようにすればよいのです。

print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'

この形式の利点は、他のオブジェクトも同時に変換できることです。
の導入により 書式付き文字列リテラル (Python 3.6, 2016-12-23 以降) これは次のように書くことができます。

import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'

ローカライゼーション

日付は使い方を間違えなければ、自動的に現地の言語や文化に合わせることができますが、ちょっと複雑なんです。SO(Stack Overflow)で別の質問をするのがいいかもしれませんね。)