2016-11-10 7 views
1

私は日付オブジェクトを受け取り、フォーマットに従って文字列にそれらを有効にする必要があります:私はPythonのdatetime.strftimeメソッドを使用してこれを実現するためにdatetime strftimeの欠けている部分をゼロで置き換えるには?

"%a %b %d %H:%M:%S %z %Y" 

を。問題は、これらの日付のオブジェクトはすべて、このデータを持っていない、時には、例えば、私は両方を持つことができるということです。

文字列フォーマット方法を試してみました
a = datetime.date(1999, 1, 2) 
b = datetime.datetime(2015, 10, 1, 9, 38, 50, 920000, tzinfo=datetime.timezone.utc) 

"{:%a %b %d %H:%M:%S %z %Y}".format(a) 

しかし、タイムゾーンが設定されていない場合それはそう、ドロップされます。

"{:%a %b %d %H:%M:%S %z %Y}".format(b) 
'Thu Oct 01 09:38:50 +0000 2015' 

しかし

"{:%a %b %d %H:%M:%S %z %Y}".format(a) 
'Sat Jan 02 00:00:00 1999' 
を210

あることが予想され、しばらく:

'Sat Jan 02 00:00:00 +0000 1999' 

がゼロでタイムゾーンを埋めるために何とかそれは可能ですか?

+0

http://stackoverflow.com/questions/7065164/how-to-make-an-unaware-datetime-timezone-aware-in-pythonまたはhttp://stackoverflow.com/questions/1301493/setting- timezone-in-pythonは、datetimeタイムゾーンを認識させることで、あなたの質問に答えますか? –

答えて

0

おそらくstrftime documentationから気づいたように、datetimeオブジェクトがナイーブである場合、つまりタイムゾーンが設定されていない場合、%zと%Zは空の文字列を返します。

タイムゾーンがわからなくても常に+0000を出したい場合は、それをUTCとして扱います。

デフォルトを設定します。タイムゾーンが指定されていない場合は、タイムゾーン情報(例:tzinfo = datetime.timezone.utc)を使用します。あなたはその場合に+0000を得るでしょう。

更新、応答でコメントするには:

リアライズを、あなたはformatを始まる行にいる時間によって、あなたはすでにコミットしていること。その時点でのあなたのdatetimeは、すでにナイーブであるか認識しています。どちらの状況でstrftimeがどのように動作するかはよく定義されています。デフォルトを設定するときは、おそらくフォーマットポイントで行うのではなく、datetimeを作成する時点で行うべきです。

あなたのコードをもっと見ることなく、もっと具体的な助けをすることはできませんが、あなたはaとbのデータを区別するものがありますので、tzinfoがあるかどうかを知る必要があります。あなたのデフォルトを入れて、私は例を作るつもりですので、私はどこを表示することができます。

for it in magic_iterator: 
    (year, month, day, hour, minute, second, microsecond, timezone) = it.get_data() 
    # note, some of these can be None. Set defaults: 
    hour = hour or 0 
    minute = minute or 0 
    second = second or 0 
    timezone = timezone or datetime.tzinfo.utc 

    foo = datetime(year, month, day, hour, minute, second, microsecond, timezone) 
    # do something with foo 

このこれらの値は、(すなわち偽falseyであれば、0、または空の文字列が表示されますorで構築)、そうであれば適切に設定します。時、分、秒の場合、実際の値が0の場合は、0が偽であるため、句の一部分であるorが実行されます。これは通常論理エラー(hour = hour if hour is not None else 0のようなものを実行することで解決されます)ですが、この場合は0に既に0が設定されているので、問題ありません。

あなたはformatに取り付けられた1つのライナーとしてそれを行うことができますが、考えてみれば、それは醜いです:

"{:%a %b %d %H:%M:%S %z %Y}".format(a if a.tzinfo else datetime(a.year, a.month, a.day, a.hour, a.minute, a.second, a.microsecond, datetime.tzinfo.utc)) 

私は多くの場合より日時の建設にデフォルトを置くことを好むだろう書式設定行

+0

もちろん、それは簡単な解決策ですが、私はフォーマットのようないくつかの1つのライナーがあることを期待していました。 'a = None; "{}"。書式(aまたは "デフォルト!") ' – wasd

関連する問題