我想知道是否有人知道一个好的日期和时间库,它具有正确实现的功能,如下所示:
我目前正在使用Python,但我很高兴能用其他语言(如perl,C或C ++)提供解决方案。
我发现内置的Python库缺乏夏令时逻辑的复杂性,并且没有一种明显的方式(对我来说)设置自定义时间范围之类的东西。
答案 0 :(得分:11)
Python的标准库的datetime
模块故意局限于无争议的方面,这些方面并没有因立法命令而一直在变化 - 这就是为什么它故意排除对时区,DST,模糊解析和疾病的直接支持的原因。定义的算术(例如“一个月后”......)等。最重要的是,dateutil用于多种操作,而pytz用于时区(包括DST问题),添加了您要求的大部分内容,但不是极像“假期”这样的爆炸性事物,不仅在政治管辖范围内变得如此疯狂,甚至在同一管辖范围内的雇主之间也是如此(例如在美国,一些雇主认为“哥伦布日”是一个假期,但许多人不这样做 - 有些人没有办公室在许多地方,把它作为一些地方的假期而不是其他地方;考虑到这完全的,完全混乱,期望找到一个通用的图书馆,以某种方式神奇地理解混乱是非常奇怪的。)
答案 1 :(得分:6)
查看dateutil和mx.DateTime个软件包。
答案 2 :(得分:6)
前几天看到这个,我自己没有用过它......看起来很有希望。 http://crsmithdev.com/arrow/
答案 3 :(得分:4)
我应该可以指定时区 像“美国/东方”,它应该是 聪明到足以知道是否给定 时间戳应对应EST或 EDT。
这部分并不总是可行的 - 就像一年中的某一天上午2:30不存在一样(在夏令时切换为凌晨2点的时区),凌晨2:30存在两次另一天 - 一次在EDT,一小时后在EST。如果您将该日期/时间传递给图书馆,它如何知道您正在谈论的两次中的哪一次?
答案 4 :(得分:2)
尽管这本书已有十多年的历史,但我强烈建议您阅读Lance Latham的Standard C Date/Time Library: Programming the World's Calendars and Clocks。这是你不时会回忆起来的书中的一本,令人惊讶的是它完全是书面的。作者详细介绍了关于日历和计时系统的详细信息,并一路开发源代码到库(用C语言编写)来处理所有计算。
令人惊讶的是,它似乎还在印刷中......
答案 5 :(得分:1)
我刚刚发布了一个名为Fleming(https://github.com/ambitioninc/fleming)的Python库,它似乎解决了与夏令时相关的两个问题。
问题1,算术 - Fleming有一个add_timedelta函数,它接受timedelta(来自Python的datetime模块)或来自python-dateutil的relativedelta,并将其添加到datetime对象。 add_timedelta函数处理datetime对象跨越DST边界的情况。查看https://github.com/ambitioninc/fleming#add_timedelta以获取完整的说明和示例。这是一个简短的例子:
import fleming
import datetime
import timedelta
dt = fleming.add_timedelta(dt, datetime.timedelta(weeks=2, days=1))
print dt
2013-03-29 20:00:00-04:00
# Do timedelta arithmetic such that it starts in DST and crosses over into no DST.
# Note that the hours stay in tact and the timezone changes
dt = fleming.add_timedelta(dt, datetime.timedelta(weeks=-4))
print dt
2013-03-01 20:00:00-05:00
问题2,自然边界对齐 - 弗莱明有一个可以任意对齐的地板功能。假设您的时间是日期时间(2013年,2月3日),您给它的楼层间隔为月= 3。这意味着它将四舍五入到最接近的三分之一(四分之一)。您可以通过在参数中使用year = 10来类似地指定最近的十年。查看(https://github.com/ambitioninc/fleming#floordt-within_tznone-yearnone-monthnone-weeknone-daynone-hournone-minutenone-secondnone-microsecondnone)以获取完整示例和插图。这是一个快速的:
import fleming
import datetime
# Get the starting of a quarter by using month=3
print fleming.floor(datetime.datetime(2013, 2, 4), month=3)
2013-01-01 00:00:00