【问题标题】:Python How to Check if time is midnight and not display time if truePython如何检查时间是否为午夜,如果为真则不显示时间
【发布时间】:2017-02-28 08:30:40
【问题描述】:

我正在修改我们的太平洋时区过滤器以包含时间选项。我不希望在午夜显示时间组件。到目前为止,我们使用的唯一导入是 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()

标签: python datetime timezone pytz


【解决方案1】:

试试这个 UTC:

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

【讨论】:

    【解决方案2】:

    您也可以使用日期时间对象的.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 是一个布尔值,指示在美国/太平洋时区中是否为午夜。

    【讨论】:

      【解决方案3】:

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

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

      其中 时间 是 TimeObject (datetime.time)

      【讨论】:

        【解决方案4】:

        我相信最好的办法是在传递之前从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,因为 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'
        

        【讨论】:

        • 谢谢你,这很好!正是我想要的。
        【解决方案5】:

        检查时间是否为午夜:

        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
        

        【讨论】:

        • 我需要知道我传递给过滤器的日期字符串是否是午夜,例如:
        • 很抱歉,上面不小心输入的句子不能编辑。正如我所说,我需要将现有的日期/时间从我们的 d/b 传递到这个过滤器,该过滤器显示在一个 jinja 模板中,所以它类似于 {{item.sold_on|checkIfMidnight(time=True)}}
        • 我又做了一次......所以 time=True 告诉太平洋时间过滤器包括它返回到模板的时间。因此,在某些情况下,我们希望用日期显示时间,而在其他时候,我们只想在 jinja 模板中显示日期,因此需要过滤器。下一个问题是当我们确实想要包含时间时,我们只想包含不是午夜的时间。谢谢!
        猜你喜欢
        • 2020-02-22
        • 1970-01-01
        • 1970-01-01
        • 2012-01-11
        • 1970-01-01
        • 2021-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多