マイクロ秒コンポーネントなしの文字列へのPython日時


410

現在アムステルダム(!)の時間文字列のみを含むBitbucket API応答にUTC時間文字列を追加しています。他の場所で返されたUTC時刻文字列との一貫性を保つために、望ましい形式は2011-11-03 11:07:04+00:00後にが続きますが、それは密接な関係はありません)。

(例えば、A列を作成するための最良の方法は何だなしからマイクロコンポーネント)をdatetimeインスタンスマイクロコンポーネントは?

>>> import datetime
>>> print unicode(datetime.datetime.now())
2011-11-03 11:13:39.278026

考えられる答えとして、私に生じた最良のオプションを追加しますが、もっとエレガントな解決策があるかもしれません。

編集:私は実際には現在の時刻を出力しているわけではないことを述べておかなければなりませんdatetime.now。以前は簡単な例を示していました。したがって、ソリューションはdatetime、受信するインスタンスにマイクロ秒コンポーネントが含まれると想定しないでください。

回答:


840

datetime標準形式とは異なる特定の形式でオブジェクトをフォーマットする場合は、その形式を明示的に指定することをお勧めします。

>>> datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
'2011-11-03 18:21:26'

ディレクティブの説明については、のドキュメントをdatetime.strftime()参照してください%


10
同僚は、これが正しいアプローチであると説得力のある主張をしました。私が確信していると考えてください。
davidchambers

3
その説得力のあるケースは何ですか-datetime.replaceを使用してこのソリューションをソリューションの上に置きますか?
matlehmann 2014年

13
@matlehmann:もちろん、私はdavidchambersの同僚の議論を知りません。ただし、日付を非常に具体的な形式で印刷することを意図している場合は、この意図を明示する必要があります。この回答のコードは、「現在の時刻を取得して、このようにフォーマットする」と言っています。他の答えのコードは、「現在の時間を取り、マイクロ秒を0に設定し、それを何らかの方法で文字列に変換する」と述べています。
Sven Marnach

3
+1、文字列形式を明示することで、将来のPythonバージョンで標準のdatetime-str変換が変更された場合の問題を回避
Alan Evangelista

2
@DylanYoung OPの要件は、によって返される標準形式(デフォルトではマイクロ秒を含む)とは異なる形式で日時オブジェクトを印刷する.isoformat()ことです。それが必要な場合は、それを明確にしてください。誰もがこのコードが何をするかすぐに理解するでしょう。ドキュメントを見ない限り、他のコードを理解する人はほとんどいないでしょう。
Sven Marnach 2016年

172
>>> import datetime
>>> now = datetime.datetime.now()
>>> print unicode(now.replace(microsecond=0))
2011-11-03 11:19:07

20
読みやすく、文書化されており、動作が一貫しているので、これは適切なソリューションだと思います。" .isoformat([sep])-ISO 8601形式で日付と時刻を表す文字列を返します。 0、YYYY-MM-DDTHH:MM:SS "
Bengt

1
私の状況では、日付はすでに作成されており、2番目に「フロア」する必要がありました。これは完璧です、ありがとう。
Vigrond 2014

1
これが一番の答えです!
Havok 2014

比較のために文字列をフォーマットまたは解析するよりもはるかに優れています。ありがとうございます。
Zach Young


47

これが私のやり方です。ISOフォーマット:

import datetime
datetime.datetime.now().replace(microsecond=0).isoformat()
# Returns: '2017-01-23T14:58:07'

ISO形式が必要ない場合は、「T」を置き換えることができます。

datetime.datetime.now().replace(microsecond=0).isoformat(' ')
# Returns: '2017-01-23 15:05:27'

これは私の答えに似ています。有利にする理由がある.isoformat()以上はunicode()
davidchambers 2017年

1
Python文字列表現を使用する場合unicode()、およびISO-8601を使用する場合、使用するものに依存しますisoformat()
radtek

そうですか。確かに、unicode()より便利です.isoformat().replace('T', ' ')。;)
davidchambers 2017年

私は非ISO形式のSvenのソリューションを使用しますが、それはより明示的です:datetime.now()。strftime( "%Y-%m-%d%H:%M")、しかし 'T'を置き換えることは別のことです仕方。ISOとUnicodeの両方の日付が必要な場合は、最善の解決策になるでしょう。
radtek、2017年

isoformatセパレータ指定子を受け入れるため、置換は行われません。ただ行う:datetime.datetime.now().replace(microsecond=0).isoformat(' ')
コヤ

17

さらに別のオプション:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M:%S")
'2011-11-03 11:31:28'

デフォルトでは、これは現地時間を使用します。UTCが必要な場合は、以下を使用できます。

>>> time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
'2011-11-03 18:32:20'

OPが時間ではなく日時について質問したため、反対票を投じました。
ユルゲンA.エアハルト

15

スライスして最初の19文字を保持します。

>>> str(datetime.datetime.now())[:19]
'2011-11-03 14:37:50'

5
時間の文字列にタイムゾーンの指定を追加できるため、これは正しくありません+05:30。正しいでしょうstr(now())[:19]
K3 --- rnc 2016

1
@ K3 --- rnc:ありがとう。あなたの提案に従って更新されました。
Steven Rumbalski

年が10000
過ぎる

時間は@ditiに伝えます;)
yǝsʞǝla

8

私は通常:

import datetime
now = datetime.datetime.now()
now = now.replace(microsecond=0)  # To print now without microsecond.

# To print now:
print(now)

出力:

2019-01-13 14:40:28

7

すべてのdatetime.datetimeインスタンスにマイクロ秒コンポーネントがある(つまり、ゼロの場合)とは限らないため、文字列を "。"で分割できます。常に機能する最初の項目のみを取得します。

unicode(datetime.datetime.now()).partition('.')[0]

3

以下のようなものを試すことができます

import datetime

date_generated = datetime.datetime.now()
date_generated.replace(microsecond=0).isoformat(' ').partition('+')[0]

これは.isoformat(' ', 'seconds')、以前の回答で提案されたに劣ります。
davidchambers

1
上記で提案された以前の回答を試してみると、エラー>>> datetime.datetime.now()。isoformat( ''、 'seconds')トレースバック(最後の最新の呼び出し):ファイル "<stdin>"、行1、<モジュール>のTypeError:isoformat()は最大で1つの引数(2つ指定)を取ります
Abhishek Bajaj

ああ、分かった。これは、Python 3で私の作品ではなく、Pythonの2の
davidchambers

私はpython 3.4.3バージョンを使用していますが、そのエラーが表示されます。>>> datetime.datetime.now()。isoformat( ''、 'seconds')トレースバック(最新の呼び出しは最後):ファイル "<stdin>"、1行目<モジュール> TypeError:isoformat()は最大で1つの引数(2つ指定)
Abhishek Bajaj

1

これが最も簡単な方法であることがわかりました。

>>> t = datetime.datetime.now()
>>> t
datetime.datetime(2018, 11, 30, 17, 21, 26, 606191)
>>> t = str(t).split('.')
>>> t
['2018-11-30 17:21:26', '606191']
>>> t = t[0]
>>> t
'2018-11-30 17:21:26'
>>> 

datetime.datetime.now()。strftime( "%Y-%m-%d%H:%M:%S") '2011-11-03 18:21:26'はるかに簡単なimo。しかし、簡単は最高ではありません
An0n

1

これは私が理解し、それをよりよく覚えることができるために使用します(そして日付と時刻の形式も選択に基づいてカスタマイズできます):-

import datetime
moment = datetime.datetime.now()
print("{}/{}/{} {}:{}:{}".format(moment.day, moment.month, moment.year,
                                 moment.hour, moment.minute, moment.second))

鮮やかさ。シンプルで柔軟性があり、プラットフォームに依存しません(strftimeとは異なります)。
Endre Both
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.