2015-01-04 33 views
0

我有处理日期的代码lot在Python中处理大量strftime

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") 

都在我的代码从一个字符串读取这些日期时,我有一个小的辅助功能。这不仅会变成一种痛苦,而且相同代码的大量重用会对我的分解提高可维护性和清晰度。

那么,什么是做到这一点的最简单,最Python的方式:

  • 我应该换行的Python我自己的类内的datetime?这似乎是非Pythonic,有点讨厌。
  • 我应该以什么方式猴子补丁datetime?也似乎很讨厌。
  • 其他方式......?

任何帮助/想法与此将不胜感激。

+1

为什么你没有反向函数'date - > iso_date_string'?或者,你可以使用标准的日期时间。__str__'并将输出格式保留为用户选择的任何内容。 – jonrsharpe 2015-01-04 11:59:36

+0

辅助函数(获取日期对象并返回一个字符串)似乎是最直接的解决方案。 – NPE 2015-01-04 12:06:31

回答

1

最直接的方法是使用一个辅助函数对称的date你已经有:

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

然后格式化日期可以在一个简单的函数调用像datestr(d)来完成。

将一对辅助函数转换为字符串/从字符串转换是一种简单明了的方式来包装您的特定功能。我不认为通过猴子补丁来使事情变得更加复杂和容易出错......会获得任何收益。

如果你有很多这样的帮助函数可以处理日期,将它们移动到一个单独的模块可能会有用,从而使事情更有条理。例如,如果您创建了dateutil模块,则很明显该模块包含可用于日期的辅助函数。

+0

尽管可能不会调用你的助手模块'dateutil',因为[已经存在](https://pypi.python.org/pypi/python-dateutil) – sapi 2015-01-04 12:21:26

0

你可以使用一个更好的名字: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()

1

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

考虑如何破日期时间,如果我想要再次做到这一点,有计划,我会用德罗宁的完全控制(http://delorean.readthedocs.org/en/latest/)时间处理库。在你自己的类中包装datetime并不是一件坏事,它是一种处理Python时间处理问题的方法,只是不要自己推出,因为它已经完成了。

+0

感谢您向Delorean提出的观点。尽管我需要但是非常有用,这可能是过度的。 – 2015-01-05 11:09:56

+0

不客气。更多的人应该知道这个图书馆。 :) – grasshopper 2015-01-05 11:16:21

+0

@ user383105:不要相信'Delorean'的盲目性。 [它的作者不知道(或假装)datetime.now()和datetime.now(timezone_object)']之间的区别(https://github.com/myusuf3/delorean/pull/46) – jfs 2015-01-06 06:26:16