【问题标题】:Accessing datetime.now() values in Python在 Python 中访问 datetime.now() 值
【发布时间】:2013-12-27 05:10:22
【问题描述】:

我希望能够在我的程序中实现一个条件,它只能运行 N 小时,也许用户可以指定 N,但我们不要向前跳。

我想我可以使用 datetime.now() 并将下面的值存储在一个变量中,time

>>> time 
>>> time = datetime.datetime(2013, 12, 9, 21, 50, 32, 405329)

关于如何访问 (--) 之间的第四个字段的任何想法,因为它是一个字符串?

我的情况类似于while time != timeEnd,其中 timeEnd 的值如下:

>>> timeEnd = datetime.datetime(2013, 12, 9, 21+N, 50, 32, 405329)

谢谢

【问题讨论】:

  • 你在说什么--
  • 你是不是很迂腐?
  • 您不想只检查小时字段的日期/时间数学 - 您可以轻松地在(3 小时 + 1 分钟)或(5 小时 - 1 分钟)终止,或者如果某些任务运行时间很长,甚至可能错误地跨越数天。按照以下答案的建议使用某种时间增量。
  • @adampski:不,我完全不明白你在说什么。要么您在某处询问文字 --,在这种情况下没有这样的事情,要么您将其用作示例中某处存在的字符串的占位符,在这种情况下 仍然存在 没有这样的事情;任何地方都看不到任何字符串。
  • @abarnet 好吧 (--) 指的是 datetime 对象的属性。简直不敢相信把它们都写出来,这是所有价值观的简写。

标签: python datetime time while-loop timedelta


【解决方案1】:

不要使用不知道的本地日期时间对象,例如由now() 返回的对象,除非您想将它们展示给本地用户。 There are many perils.

有一个difference between "What time is it?" and "How many seconds elapsed?"。前者更容易发现。

要运行N 小时,您可以:

from time import monotonic as timer # or time.time if it is not available

endtime = timer() + N * 3600
while timer() < endtime:
    # do your thing (mind what clocks use sleep(), join(), lock.acquire())

即使计算机时间在程序执行期间手动或由于 DST 转换而发生变化,它也能正常工作。见Rational section from pep-418 for introducing time.monotonic in Python

您可以根据需要/可用系统选择其他计时器。例如,您可以使用提供更好精度但可能更快溢出的计时器,或者考虑到 NTP 邻接可能提供比本地 CPU 或 the time while the system were asleep or suspended 更好的时钟(想象一下打开封面后您希望发生什么几个小时后你的笔记本)。

datetime.now() 对象(天真的分解时间)如果您希望在某个本地时间发生某些事情,而不管从现在起经过了多少秒,例如,在 7pm 之后的任何一天(午夜之前)做某事,这可能会很有用:

from datetime import datetime, time

if datetime.now().time() > time(19):
   # do something

【讨论】:

    【解决方案2】:

    我希望能够在我的程序中实现一个条件,它只能运行 N 小时,也许用户可以指定 N,但我们不要向前跳。

    关于如何访问 (--) 之间的第四个字段的任何想法,因为它是一个字符串?

    我在您的代码中看不到任何 -- 或任何字符串。你有一个datetime 对象,它有一个hour 成员。但是,我无法想象你怎么会在你的代码中使用这样的东西。

    只需减去两个datetime 对象,就可以得到一个timedelta 对象。您可以将 timedelta 对象与另一个对象进行比较。例如:

    >>> start_time = datetime.datetime.now()
    
    # 2 hours later
    
    >>> end_time = datetime.datetime.now()
    >>> duration = end_time - start_time
    >>> duration > datetime.timedelta(hours=5)
    False
    
    # another 4 hours
    
    >>> datetime.datetime.now() - start_time > datetime.timedelta(hours=5)
    True
    

    【讨论】:

    • 没有意识到它是一个对象。对不起!谢谢。
    【解决方案3】:

    您可以将timedelta 添加到datetime 以获得新的datetime

    >>> import datetime
    >>> now = datetime.datetime.now()
    >>> end_time = now + datetime.timedelta(hours=6)
    >>> print now
    2013-12-09 17:03:06.979628
    >>> print end_time
    2013-12-09 23:03:06.979628
    >>> 
    

    那么……

    while datetime.datetime.now() < end_time:
        pass # do work
    

    【讨论】:

    • datetime.now() &lt; end_time 可能不会给您的6 小时数。如果手动调整计算机时钟,它可能会早/晚一个小时(由于 DST)或任何其他时间量发生。或者如果计算机暂停了一段时间;当您打开笔记本封面时,您可能不希望所有事件同时发生。 You can avoid such issues
    【解决方案4】:
    >>> from datetime import datetime
    >>> d = datetime.now()
    >>> d
    datetime.datetime(2013, 12, 9, 23, 0, 20, 669780)
    >>> d.hour
    23
    

    如果您想检查脚本是否运行了N 小时,我建议检查(now() - start_time).total_seconds() 值。它会告诉你脚本运行了多少秒。

    同样,您可以像这样设置timeEnd timeEnd = time + timedelta(hours=N)

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多