我实际上正在寻找这个问题的反面: Converting string into datetime
我有一个日期时间对象的列表,我想从中创建一个对人类友好的字符串,例如“2012 年 2 月 4 日 1 月 27 日和 30 日”。有任何想法吗?
请注意,strftime 仅适用于单个日期时间对象。这里的问题是您有一个日期时间列表,这些日期时间的间隔可能不均匀,可能跨越月或年的界限,但整个日期范围必须用一个简洁的字符串表示。
我实际上正在寻找这个问题的反面: Converting string into datetime
我有一个日期时间对象的列表,我想从中创建一个对人类友好的字符串,例如“2012 年 2 月 4 日 1 月 27 日和 30 日”。有任何想法吗?
请注意,strftime 仅适用于单个日期时间对象。这里的问题是您有一个日期时间列表,这些日期时间的间隔可能不均匀,可能跨越月或年的界限,但整个日期范围必须用一个简洁的字符串表示。
这.
your_date.isoformat() # -> '2002-03-11'
your_date.strftime("%A %d. %B %Y") # -> Monday 11. March 2002
更新:您需要列表理解才能在一行中完成。
date_strings = [dt.strftime("%A %d. %B %Y") for dt in your_date_list]
或者,使用 for 循环:
date_strings = []
for dt in your_date_list:
date_str.append(dt.strftime("%A %d. %B %Y"))
更新2:我相信这更接近你的期望,但仍然是你想要的,只有你知道:你想什么时候展示这一年,什么时候不想展示?何时仅显示月份或日期等...但这基本上是一个想法。您可能需要做某种类来表示范围,您可以在那里选择格式,比较范围之间的月份和年份,......这就是我现在想出的。希望能帮助到你:
import datetime
# sample input
dates = [datetime.date(2012, 5, 21), datetime.date(2012, 5, 23),
datetime.date(2012, 5, 25), datetime.date(2012, 5, 19),
datetime.date(2012, 5, 17), datetime.date(2012, 5, 26),
datetime.date(2012, 5, 18), datetime.date(2012, 5, 20)]
def get_consecutive_ranges(dates):
dates = sorted(dates)
delta_1day = datetime.timedelta(days=1)
ranges = []
last_d = dates[0]
tmp_range = [last_d, None]
for d in dates[1:]:
if d-last_d <= delta_1day:
# the difference between the dates is less than a day
# we can extend the range, update the right-most boundary
tmp_range[1] = d
else:
ranges.append(tmp_range)
tmp_range = [d, None]
last_d = d
else:
ranges.append(tmp_range)
return ranges
ranges = get_consecutive_ranges(dates)
fmt = "%d %b %Y"
output = ", ".join([("%s" % (r[0].strftime(fmt),)) if r[1] is None else \
("%s-%s" % (r[0].strftime(fmt), r[1].strftime(fmt))) \
for r in ranges])
print output
>>> dt=datetime.date(2012,2,4)
>>> dt.strftime('%A %B %d, %Y')
'Saturday February 04, 2012'