【问题标题】:Python's datetime conversionPython的日期时间转换
【发布时间】:2017-01-26 05:33:13
【问题描述】:

这是我的代码:

from datetime import datetime

def get_local_time(time_str):
    """
    takes a string in the format of '27 March at 3:00' which is UTC
    and converts it to local time and AM/PM
    :param time_str:
    """
    offset = datetime.now() - datetime.utcnow()
    time_dt = datetime.strptime(time_str, '%d %b at %H:%M')
    return (time_dt + offset).strftime('%I:%M %p')

我遇到的问题是使用 time_str,它只是时间,不包括日/月。即:“02:00”

如果我将其更改为:time_dt = datetime.strptime(time_str, '%H:%M') 那么我会收到关于 strftime 和 1900 年之前的年份的错误。

所以我被难住了。需要做什么才能在输入字符串中只允许一个时间?

【问题讨论】:

    标签: python python-2.7 python-datetime


    【解决方案1】:

    您可以尝试使用dateutil 包。 parser.parse() 方法适用于您的输入字符串更改时。如果仅在字符串中指定时间,它将使用今天的日期构造一个 datetime 对象。它将处理各种其他格式。

    from datetime import datetime
    from dateutil import parser
    
    def get_local_time(time_str):
        """
        takes a string in the format of '27 March at 3:00' which is UTC
        and converts it to local time and AM/PM
        :param time_str:
        """
        offset = datetime.now() - datetime.utcnow()
        time_dt = parser.parse(time_str)
        return (time_dt + offset).strftime('%I:%M %p')
    

    如果您仅限于 datetime 包,您可以执行以下操作:

    from datetime import datetime
    
    def get_local_time(time_str):
        """
        takes a string in the format of '27 March at 3:00' which is UTC
        and converts it to local time and AM/PM
        :param time_str:
        """
        if len(time_str) <= 5:
            time_str = datetime.now().strftime('%d %B at ') + time_str
        offset = datetime.now() - datetime.utcnow()
        time_dt = datetime.strptime(time_str, '%d %B at %H:%M')
        return (time_dt + offset).strftime('%I:%M %p')
    
    print get_local_time('27 March at 3:00')
    print get_local_time('3:00')
    

    或者你可以这样做:

    from datetime import datetime
    
    def get_local_time(time_str):
        """
        takes a string in the format of '27 March at 3:00' which is UTC
        and converts it to local time and AM/PM
        :param time_str:
        """
        offset = datetime.now() - datetime.utcnow()
        if len(time_str) <= 5:
            time_dt = datetime.combine(datetime.now().date(), datetime.strptime(time_str, '%H:%M').time())
        else:
            time_dt = datetime.strptime(time_str, '%d %B at %H:%M')
        return (time_dt + offset).strftime('%I:%M %p')
    
    print get_local_time('27 March at 3:00')
    print get_local_time('3:00')
    

    【讨论】:

    • 我猜这会很好用。但是我将它与另一个应用程序(Kodi)结合使用,并且由于 dateutil 似乎不是其中包含的库,因此它不起作用。除非有人有别的东西,否则仍将其标记为答案。
    • @Bahnzo 如果您不想要 dateutil 包,我会改进它。给我一些时间。
    • 它没有用,但这是一个简单的更改。字符串的 len 必须是 5 而不是 4。所以: if len(time_str)
    • @Bahnzo 哎呀,我忘了在第三个 sn-p 中将 4 更改为 5。如果你能看到,我在第二次 sn-p 中正确地做到了。
    【解决方案2】:

    我刚刚在repl中尝试过。它对我有用:

    >>> from datetime import datetime
    >>> time = "02:00"
    >>> time_dt = datetime.strptime(time, '%H:%M')
    >>> time_dt
    datetime.datetime(1900, 1, 1, 2, 0)
    >>>
    

    如果我没记错的话,日期时间永远不会存储一个时间,总会有一个 1900 年 1 月 1 日的虚拟日期。如果您想存储没有虚拟日期的时间,请尝试使用time 类。它还有一个 strftime 函数,请参阅此处的文档:https://docs.python.org/2/library/time.html

    如果它不起作用,您也可以尝试将不同的虚拟日期添加到您的日期时间。

    【讨论】:

    • 我肯定遇到了错误。这与使用 python 2.7 的名为“Kodi”的应用程序一起使用。所以我不确定这是如何干扰的。但你也是对的,我可以添加一个虚拟的日期和月份,它工作正常。看来我不应该这样做。
    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2015-08-19
    • 2020-06-15
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多