【问题标题】:Python Date ComparisonsPython 日期比较
【发布时间】:2008-09-24 23:34:31
【问题描述】:

我想知道一个特定的 python 日期时间对象是否早于 X 小时或分钟。我正在尝试做类似的事情:

if (datetime.now() - self.timestamp) > 100
# Where 100 is either seconds or minutes

这会产生类型错误。

在 python 中进行日期时间比较的正确方法是什么?我已经看过WorkingWithTime,它很接近但不是我想要的。我假设我只想以秒为单位表示 datetime 对象,以便可以进行正常的 int 比较。

请发布日期时间最佳做法列表。

【问题讨论】:

  • datetime.now()(或作为 naive 日期时间对象给出的其他本地时间)可能会因其他原因在 DST 转换或本地时区的 UTC 偏移更改时失败。应使用 UTC 时间或可感知的日期时间对象,例如 datetime.utcnow()datetime.now(timezone.utc).astimezone()

标签: python datetime


【解决方案1】:

使用datetime.timedelta 类:

>>> from datetime import datetime, timedelta
>>> then = datetime.now() - timedelta(hours = 2)
>>> now = datetime.now()
>>> (now - then) > timedelta(days = 1)
False
>>> (now - then) > timedelta(hours = 1)
True

你的例子可以写成:

if (datetime.now() - self.timestamp) > timedelta(seconds = 100)

if (datetime.now() - self.timestamp) > timedelta(minutes = 100)

【讨论】:

    【解决方案2】:

    将差异与您创建的时间增量进行比较:

    if datetime.datetime.now() - timestamp > datetime.timedelta(seconds = 5):
        print 'older'
    

    【讨论】:

      【解决方案3】:

      替代方案:

      if (datetime.now() - self.timestamp).total_seconds() > 100:
      

      假设 self.timestamp 是一个日期时间实例

      【讨论】:

      • 值得一提的是,total_seconds() 从 Python 2.7 开始可用。
      【解决方案4】:

      您可以使用返回对象的“天”和“秒”属性的组合来找出答案,如下所示:

      def seconds_difference(stamp1, stamp2):
          delta = stamp1 - stamp2
          return 24*60*60*delta.days + delta.seconds + delta.microseconds/1000000.
      

      如果您总是想要正数秒数,请在答案中使用 abs()。

      要了解时间戳过去多少秒,您可以这样使用它:

      if seconds_difference(datetime.datetime.now(), timestamp) < 100:
           pass
      

      【讨论】:

        【解决方案5】:

        您可以减去两个datetime 对象以找出它们之间的差异。
        您可以使用datetime.fromtimestamp 来解析 POSIX 时间戳。

        【讨论】:

          【解决方案6】:

          像这样:

          # self.timestamp should be a datetime object
          if (datetime.now() - self.timestamp).seconds > 100:
              print "object is over 100 seconds old"
          

          【讨论】:

          • 我认为这行不通。 timedelta docs.python.org/lib/datetime-timedelta.html 的 seconds 属性限制为 1 天,因此如果您的时间长度超过 1 天,它将不准确
          • 您所要做的就是将它与另一个 timedelta 而不是 seconds 属性进行比较。
          【解决方案7】:

          将您的时间增量转换为秒,然后使用转换回经过的小时数和剩余分钟数。

          start_time=datetime(
             year=2021,
             month=5,
             day=27,
             hour=10,
             minute=24,
             microsecond=0)
          
           end_time=datetime.now()
           delta=(end_time-start_time)
          
           seconds_in_day = 24 * 60 * 60
           seconds_in_hour= 1 * 60 * 60
          
           elapsed_seconds=delta.days * seconds_in_day + delta.seconds
          
           hours=  int(elapsed_seconds/seconds_in_hour)
           minutes= int((elapsed_seconds - (hours*seconds_in_hour))/60)
          
           print("Hours {} Minutes {}".format(hours,minutes))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-17
            • 2011-12-31
            • 2018-11-24
            相关资源
            最近更新 更多