Python如何检查时间是否为午夜并在条件成立时不显示时间。

5

我正在修改我们的太平洋时区过滤器,以包括时间选项。如果是午夜,则不想显示时间组件。到目前为止,我们唯一使用的导入是dateutil.parser。如果有最佳解决方案的指针,将不胜感激!谢谢。

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)

жИСиІЙеЊЧдљ†еПѓиГљжГ≥ж£АжЯ•timestamp.tzinfoжШѓеР¶дЄЇNoneпЉМиАМдЄНжШѓtzname()гАВ - Paul
5个回答

5

我认为最好的方法是在传递之前从datetime中获取time(),然后将其与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,因为{{link1:format()已经是内置的}}。此外,从设计的角度来看,在覆盖指定格式字符串方面,让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'

谢谢,这个很好用!正是我想要的。 - Adrianopolis

5

尝试使用以下方法来获取UTC时间:

def checkIfMidnight():
    return (time.time() % 86400) == 0

4

检查时间是否为午夜:

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

我需要知道我传递给过滤器的日期字符串是否为午夜,例如: - Adrianopolis
抱歉,它不让我编辑上面误输入的句子。正如我所说,我需要将我们数据库中的现有日期/时间传递到此过滤器,以便在jinja模板中显示,因此它可能是这样的:{{ item.sold_on | checkIfMidnight(time=True) }}。 - Adrianopolis
我又做错了...所以time=True告诉太平洋时间过滤器在返回模板时包含时间。因此,在某些情况下,我们想要在jinja模板中显示日期和时间,而在其他情况下,我们只想要显示日期,因此需要使用过滤器。接下来的问题是,当我们确实想包括时间时,我们只想在不是午夜时包括时间。谢谢! - Adrianopolis

3

或者您可以使用datetime对象的.hour.minute.second属性。就像这样:

from datetime import datetime as dt
from pytz import timezone

now = dt.now(timezone('US/Pacific'))
midnight = now.hour == 0 and now.minute == 0 and now.second == 0 and now.microsecond == 0

midnight 是一个布尔值,表示在美国太平洋时区是否已经到了午夜。


1

我不确定这是否是你正在寻找的解决方案,但个人使用简单比较:

import datetime   
...
time == datetime.time(hour=0, minute=0, second=0, microsecond=0)

其中time是TimeObject(datetime.time)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接