【问题标题】:How to get min, seconds and milliseconds from datetime.now() in python?如何从 python 中的 datetime.now() 获取分钟、秒和毫秒?
【发布时间】:2012-03-22 18:27:48
【问题描述】:
>>> a = str(datetime.now())
>>> a
'2012-03-22 11:16:11.343000'

我需要得到这样的字符串:'16:11.34'

应该尽可能紧凑。

或者我应该使用 time() 代替吗? 如何获得?

【问题讨论】:

  • 你的意思是你希望它被截断为16:11.34,或者别的什么?
  • 是的,转录或格式化或解析。我不知道。
  • @Marcin,我没有尝试过任何东西,因为我不知道该尝试什么。
  • 也许应该写成 whathaveyouresearched ...

标签: python datetime time


【解决方案1】:

怎么样:

datetime.now().strftime('%M:%S.%f')[:-4]

我不确定“毫秒只有 2 位数字”是什么意思,但这应该保留 2 位小数。通过操纵 strftime 格式字符串来降低精度可能还有一种更优雅的方法——我不完全确定。

编辑

如果%f 修饰符对您不起作用,您可以尝试以下方法:

now=datetime.now()
string_i_want=('%02d:%02d.%d'%(now.minute,now.second,now.microsecond))[:-4]

再次,我假设您只是想截断精度。

【讨论】:

  • '>>>datetime.now().strftime('%M:%S.%f')[:-4]' 结果:'' 有什么不正确的。
  • [:-4] 表示“从头开始并排除最后 4 个字符”。出于某种原因,%f 在这里不起作用,我的最终结果是36:31.f 被截断为36:。 @Prostak 也可能会得到截断的结果...
  • 什么不正确?它会引发错误吗?我认为 %f 修饰符是在 python 2.6 中添加的(虽然我并不肯定)——你使用的是什么版本的 python?
  • 我仅限于 2.4.3。当我使用datetime.now().strftime('%M:%S.%f')[:-4] 时,我得到''。如果我使用datetime.now().strftime('%M:%S.f')[:-4],我会得到'46:'
  • 啊……我添加了一个解决方案,它也应该适用于旧版本。
【解决方案2】:

此解决方案与@gdw2 提供的解决方案非常相似,只是字符串格式正确完成以匹配您的要求 - “应该尽可能紧凑”

>>> import datetime
>>> a = datetime.datetime.now()
>>> "%s:%s.%s" % (a.minute, a.second, str(a.microsecond)[:2])
'31:45.57'

【讨论】:

  • 方法strftime() 怎么样......我只是无法弄清楚毫秒参数datetime.now().strftime('%M:%S.??')。也许你知道?
  • 如果您必须使用 strftime 那么来自@mgilson 的解决方案似乎是您需要做的,即: datetime.datetime.now().strftime("%M:%S. %f")[:-4] 以获取您要求的确切格式 >>>import datetime >>>datetime.datetime.now().strftime("%M:%S.%f")[:-4] '14:07.90'
  • 但我不必使用strftime()............它只是提供一条线解决方案的一种
  • 在这种情况下,如果您不介意对 datetime.now() 的三个不同函数调用,则可以执行 >>> "%s:%s.%s" % (datetime.datetime.now().minute, datetime.datetime.now().second, str(datetime.datetime.now().microsecond)[:2]) '21:51.16' 这确实使调用 datetime.now() 变得多余,但我认为三个不同的函数调用没有时间差异。如果我错了,请纠正我。
【解决方案3】:

另一个类似的解决方案:

>>> a=datetime.now()
>>> "%s:%s.%s" % (a.hour, a.minute, a.microsecond)
'14:28.971209'

是的,我知道我没有得到完美的字符串格式。

【讨论】:

  • 方法strftime() 怎么样......我只是无法确定毫秒参数datetime.now().strftime('%M:%S.??')。也许你知道?
  • 我会使用%d 而不是%s,因为您正在处理整数值(digits)。
【解决方案4】:
import datetime from datetime

now = datetime.now()

print "%0.2d:%0.2d:%0.2d" % (now.hour, now.minute, now.second)

你可以对日和月等做同样的事情。

【讨论】:

    【解决方案5】:

    如果您希望 datetime.now() 精确到分钟,您可以使用

    datetime.strptime(datetime.now().strftime('%Y-%m-%d %H:%M'), '%Y-%m-%d %H:%M')
    

    同样的时间会是

    datetime.strptime(datetime.now().strftime('%Y-%m-%d %H'), '%Y-%m-%d %H')
    

    这是一种黑客攻击,如果有人有更好的解决方案,我会全力以赴

    【讨论】:

      【解决方案6】:

      time.second 有助于将它放在 python 的顶部。

      【讨论】:

        【解决方案7】:

        很抱歉打开一个旧线程,但我发帖是为了以防万一它对某人有所帮助。这似乎是 Python 3 中最简单的方法。

        from datetime import datetime
        
        Date = str(datetime.now())[:10]
        Hour = str(datetime.now())[11:13]
        Minute = str(datetime.now())[14:16]
        Second = str(datetime.now())[17:19]
        Millisecond = str(datetime.now())[20:]
        

        如果您需要将值作为数字,只需将它们转换为 int 例如

        Hour = int(str(datetime.now())[11:13])
        

        【讨论】:

        • 这不是一个好主意。您没有使用库提供的方法 - 请参阅其他答案。如果他们改变了格式以改变空格,你最终会得到硬编码的字符串位置埋在你的代码深处,这充其量会引发错误,最坏的情况会导致计算不正确并且可能难以调试。如果可以避免,切勿对此类职位进行硬编码,您可以在这里。
        猜你喜欢
        • 2012-06-08
        • 1970-01-01
        • 2013-01-12
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-06
        • 1970-01-01
        相关资源
        最近更新 更多