2016-10-18 4 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

Я считаю, что лучше всего сделать было бы просто взять time() от datetime перед передачей его, а затем сравните, что datetime.time(0, 0).

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) 

Обратите внимание, что я изменил format к date_fmt, потому что format() is already a builtin. Кроме того, с точки зрения дизайна, вероятно, не очень хорошая идея: 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

Я сделал он снова ... так что время = Истина говорила фильму о временном времени, чтобы включить время, когда оно возвращается в шаблон. Поэтому в некоторых случаях мы хотим показать время с датой и другими моментами, когда мы просто хотим, чтобы дата отображалась в шаблоне jinja, следовательно, в фильтре. Следующий вопрос - это когда мы хотим включить время, в которое мы хотим включить время, если оно не полночь. Благодаря! – Adrianopolis

 Смежные вопросы

  • Нет связанных вопросов^_^