2016-10-18 11 views
3

太平洋標準時の時間フィルタを変更して時刻オプションを追加しました。私は真夜中なら時間成分を表示したくありません。これまでに使用している唯一のインポートはdateutil.parserです。最高のソリューション上の任意のポインタをいただければ幸いです!ありがとう。Python時間が真夜中かどうかをチェックし、真の場合は時間を表示しない方法

def to_pacific_date_str(timestamp, format='%Y-%m-%d', time=False): 
    pacific_timestamp = timestamp 

    if time: 
     format='%Y-%m-%d %H:%M' # 2016-10-03 00:00 
    if timestamp.tzname() is None: 
     # setting timezone lost when pulled from DB 
     utc_timestamp = timestamp.replace(tzinfo=pytz.utc) 
     # always converting to pacific timezone 
     pacific_timestamp = utc_timestamp.astimezone(pytz.timezone('US/Pacific')) 
    return pacific_timestamp.strftime(format) 
+0

私はあなたがtimestamp.tzinfo'は 'NONE'、ない' TZNAME() ''であるかどうかをチェックしたいかもしれないと思います。 – Paul

答えて

4

私が行うための最善のことは、単にdatetime.time(0, 0)にそれを比較し、その後、それを渡す前にdatetimeからtime()を取ることであろうと信じています。私はformat() is already a builtinので、date_fmtからformatを変更した

import pytz 
import datetime 

def to_pacific_date_str(timestamp, date_fmt='%Y-%m-%d', time=False): 
    pacific_timestamp = timestamp 

    if timestamp.tzinfo is None: 
     # setting timezone lost when pulled from DB 
     utc_timestamp = timestamp.replace(tzinfo=pytz.utc) 
     # always converting to pacific timezone 
     pacific_timestamp = utc_timestamp.astimezone(pytz.timezone('US/Pacific')) 

    if time and pacific_timestamp.time() != datetime.time(0, 0): 
     date_fmt = '%Y-%m-%d %H:%M' # 2016-10-03 00:00 

    return pacific_timestamp.strftime(date_fmt) 

注意。また、設計の観点からは、timeに指定された書式文字列をオーバーライドさせることはおそらくいい考えではないので、「追加時刻」部分をdate_fmt = date_fmt + ' %H:%M'に変更してください。

デモンストレーション:

>>> PST = pytz.timezone('US/Pacific') 
>>> to_pacific_date_str(PST.localize(datetime.datetime(2015, 4, 1, 0, 0)), time=True) 
'2015-04-01' 

>>> PST = pytz.timezone('US/Pacific') 
>>> to_pacific_date_str(PST.localize(datetime.datetime(2015, 4, 1, 2, 0)), time=True) 
'2015-04-01 02:00' 
+0

ありがとう、これは素晴らしい仕事でした!ちょうど私が探していたもの。 – Adrianopolis

0

時間が深夜であるかどうかを確認するには、次の

from datetime import datetime 
def checkIfMidnight(): 
    now = datetime.now() 
    seconds_since_midnight = (now - now.replace(hour=0, minute=0, second=0, microsecond=0)).total_seconds() 
    return seconds_since_midnight == 0 
+0

フィルタに渡す日付文字列が、真夜中であるかどうかを知る必要があります: – Adrianopolis

+0

申し訳ありませんが、誤って入力された上記の文章を編集することはできません。私が言っていたように、d/bの既存の日付/時刻をjinjaテンプレートに表示されているこのフィルタに渡す必要があるので、{{item.sold_on | checkIfMidnight(time = True)}} – Adrianopolis

+0

のようになりますもう一度... ... time = Trueは太平洋時間フィルタにテンプレートに返される時刻を含めるように指示していました。だから、いくつかのケースでは、日付とそれ以外の時に、私たちはジンジャーテンプレートに日付を表​​示したいので、フィルタを表示したいと思っています。次の問題は、真夜中でない場合にのみ時間を含める時間を含める場合です。ありがとう! – Adrianopolis

関連する問題