【问题标题】:Infinite Timedelta in PythonPython中的无限时间增量
【发布时间】:2015-03-18 12:35:37
【问题描述】:

如何在 Python 中表达无限时间增量?

到目前为止,我们使用 stdlib 中的 datetime,但如果它仅在第三方库中受支持,我们可以切换。

PostgreSQL 确实支持它。在我的情况下它会很方便。我想用它来表达一个未完成的间隔。

我可以使用None,但无限时间增量可以避免很多条件(if 语句)。

【问题讨论】:

  • 无限时间增量? O_o 所以datetime.now() + infinite_timedelta 的结果应该是……什么? infinitely_in_the_future?
  • 无限时间似乎很不确定,所以也许使用None
  • 也许我们应该退后一步,你想用无限的时间增量来完成什么?
  • 为什么还需要它?到目前为止,所有信息都表明这种东西几乎没有实际用途。换个东西可能会更好。
  • @IntrepidBrit 我更新了问题:我想用它来表达一个未完成的间隔。

标签: python infinite timedelta


【解决方案1】:

我发现了这个:http://initd.org/psycopg/docs/usage.html#infinite-dates-handling

PostgreSQL 可以存储“无限”日期的表示, 时间戳或间隔。无限日期不适用于 Python,所以 这些对象映射到 date.max、datetime.max、interval.max。 不幸的是,映射不能是双向的,所以这些日期将 与它们的值一起存储回数据库,例如 9999-12-31。

简答:不支持。

【讨论】:

【解决方案2】:

“未完成的间隔”可以用 datetime 表示(并且可能将其子类化以包含一个标志 startend) - 这就是我要快速实现的方法。

当你有间隔对应的结束或开始时),使用它们的差异获取timedelta

>>> from datetime import datetime, timedelta
# represent infinite time from 1/1/2014 onwards
>>> start = datetime(2014, 1, 1)
# stop that time
>>> end = datetime(2015, 1, 1)
>>> interval = end - start
>>> interval
datetime.timedelta(365)

如果您有时间以“正确的方式”执行此操作,您可以创建一个具有两个 datetime 对象(开始和结束)的特殊 timedelta 类。如果其中一个缺失,您可以假设它是一个无限的 timedelta 并将其视为这样。

例子:

from datetime import timedelta, datetime
class SpecialTimedelta(object):

    def __init__(self, start=None, end=None):
        self.start = start
        self.end = end

        if start and not isinstance(start, datetime):
            raise TypeError("start has to be of type datetime.datetime")
        if end and not isinstance(start, datetime):
            raise TypeError("end has to be of type datetime.datetime")

    def timedelta(self):
        if not (self.start and self.end):
            # possibly split cases
            return "infinite"
            # alternatives:
            # return self.start or self.end
            # raise OverflowError("Cannot quantiate infinite time with timedelta")
        return self.end - self.start

print SpecialTimedelta(datetime(1986, 1, 1), datetime(2015, 1, 1)).timedelta()
# out: 10592 days, 0:00:00
print SpecialTimedelta(datetime(1986, 1, 1)).timedelta()
# out: infinite

【讨论】:

    【解决方案3】:

    表示未完成间隔的典型方法是使用日期时间类型的最大值或NULL 作为结束时间。

    正如所示,您无法真正执行涉及无限值的计算并获得有意义的结果。

    因此,NULL 在这方面更好,只是不允许你这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-17
      • 1970-01-01
      相关资源
      最近更新 更多