在 Python 中处理大量 strftime

Dealing with lots of strftime in Python

我有处理日期的代码很多。从字符串中读取这些日期时,我有一个小辅助函数:

def date(iso_date_string, date_format='%Y-%m-%d'):
    """
    Convenience function to make a date.
    """
    return datetime.strptime(iso_date_string, date_format)

写出来的时候好像在写:

date.strftime("%Y-%m-%d")

遍及我的代码。这不仅成为一种痛苦,而且对相同代码的大量重用对我来说意味着分解以获得更好的可维护性和清晰度。

那么,最简​​单、最 Pythonic 的方法是什么:

任何 help/ideas 与此将不胜感激。

最直接的方法是使用与您已有的 date 对称的辅助函数:

def datestr(date_value, date_format='%Y-%m-%d'):
   return date_value.strftime(date_format)

然后可以通过一个简单的函数调用来格式化日期,例如 datestr(d)

有一对辅助函数来转换 to/from 字符串是包装特定功能的简单明了的方法。我不认为通过猴子修补/...使事情变得更复杂和容易出错会有所收获。

如果您有许多此类用于日期的辅助函数,将它们移至单独的模块可能会很有用,这样可以使事情更有条理。例如,如果您创建一个 dateutil 模块,很明显该模块包含用于日期的辅助函数。

您可以使用更好的名称:date_object = from_iso_date(string):

from datetime import date

def from_iso_date(string):
    """'%Y-%m-%d' string -> date object."""
    return date(*map(int, string.split("-")))

反之string = date_object.isoformat().

strftime 不适用于 <1900 年的日期。确保这在您的应用程序中不是问题。我为一个到处都有 strftime 的项目编写代码,当我们需要处理 1900 年之前的日期时,我们必须创建一个自定义函数并用它替换那些 strftime 调用。你可以在这里看到我是如何修复它的(fixed_strftime 函数):https://github.com/carolinux/TimeManager/blob/860308e1448517923ef4b6dcb6a73cbd2417c599/time_util.py

考虑到日期时间有多糟糕,如果我想重新做一遍并完全控制程序,我会使用 Delorean (http://delorean.readthedocs.org/en/latest/) 库进行时间处理。在你自己的 class 中包装 datetime 一点也不讨厌,这是解决 Python 时间处理问题的一种方法,只是不要自己滚动,因为它已经完成了。