有没有办法更改strptime()的阈值?

时间:2019-04-14 10:16:58

标签: python python-3.x datetime strptime

Python strptime()函数可将年份小于69(格式为dd-mm-yy)的所有日期转换为20XX,大于20XX的日期。

有什么方法可以调整此设置,请注意在文档中找到

datetime.strptime('31-07-68', '%d-%m-%y').date()

  

datetime.date(2068,7,31)

datetime.strptime('31-07-68', '%d-%m-%y').date()

  

datetime.date(1969,7,31)

2 个答案:

答案 0 :(得分:2)

我以这种解决方案为例,将threshold更改为1950-2049,但是您可以通过更改函数中的阈值变量来根据需要对其进行微调/移动:

from datetime import datetime, date

dateResult1950 = datetime.strptime('31-07-50', '%d-%m-%y').date()
dateResult2049 = datetime.strptime('31-07-49', '%d-%m-%y').date()

def changeThreshold(year, threshold=1950):
    return (year-threshold)%100 + threshold

print(changeThreshold(dateResult1950.year))
print(changeThreshold(dateResult2049.year))
#1950
#2049

答案 1 :(得分:1)

几乎可以肯定你的答案:不是没有Python补丁。

在CPython _strptime.py中的375行:

if group_key == 'y':
    year = int(found_dict['y'])
    # Open Group specification for strptime() states that a %y
    #value in the range of [00, 68] is in the century 2000, while
    #[69,99] is in the century 1900
    if year <= 68:
        year += 2000
    else:
        year += 1900

https://github.com/python/cpython/blob/master/Lib/_strptime.py

您可以通过在调用strptime之前进行自己的YY到YYYY转换来模拟替代方法。

技术上的告诫答案:Python是一种解释性语言,其中的模块以易于理解的方式导入,您可以在初始化运行时从技术上操作_strptime对象,并用自己的函数替换,也许是一种装饰原始函数的函数。

您将需要一个非常好的理由在生产代码中执行此操作。我曾与另一个核心库一起解决过操作系统错误,并与团队讨论了何时需要删除它。对于您的代码的任何未来维护者来说,这都是非常不直观的,9999/10000倍,最好只是在您自己的代码中调用一些实用程序库。如果确实需要执行此操作,那么很容易解决,因此,我将跳过代码示例以避免复制/粘贴。