功能齐全的日期和时间库

时间:2009-09-18 02:00:02

标签: python c datetime

我想知道是否有人知道一个好的日期和时间库,它具有正确实现的功能,如下所示:

  • 微秒级分辨率
  • 夏令时
    • 示例:它知道2009年3月8日美国不存在上午2:30的时区,这些时区尊重夏令时。
    • 我应该可以指定一个像“美国/东方”这样的时区,它应该足够聪明,知道给定的时间戳是否应该与EST或EDT相对应。
  • 自定义日期范围
    • 能够创建跳过周末和假日的专业商务日历。
  • 自定义时间范围
    • 能够定义营业时间,以便在营业时间以外请求的时间可以向上或向下舍入到下一个或上一个有效小时。
  • 算术
    • 能够添加和减去所有单位的整数(年,月,周,日,小时,分钟......)。请注意,添加0.5天的内容并不明确,因为它可能意味着12小时,或者可能意味着一天的持续时间的一半(夏令时变化不是24小时)。
  • 自然边界对齐
    • 鉴于时间戳,我希望能够做到最接近十年,一年,一周,一周,......,一小时,一小时等的事情。

我目前正在使用Python,但我很高兴能用其他语言(如perl,C或C ++)提供解决方案。

我发现内置的Python库缺乏夏令时逻辑的复杂性,并且没有一种明显的方式(对我来说)设置自定义时间范围之类的东西。

6 个答案:

答案 0 :(得分:11)

Python的标准库的datetime模块故意局限于无争议的方面,这些方面并没有因立法命令而一直在变化 - 这就是为什么它故意排除对时区,DST,模糊解析和疾病的直接支持的原因。定义的算术(例如“一个月后”......)等。最重要的是,dateutil用于多种操作,而pytz用于时区(包括DST问题),添加了您要求的大部分内容,但不是像“假期”这样的爆炸性事物,不仅在政治管辖范围内变得如此疯狂,甚至在同一管辖范围内的雇主之间也是如此(例如在美国,一些雇主认为“哥伦布日”是一个假期,但许多人不这样做 - 有些人没有办公室在许多地方,把它作为一些地方的假期而不是其他地方;考虑到这完全的,完全混乱,期望找到一个通用的图书馆,以某种方式神奇地理解混乱是非常奇怪的。)

答案 1 :(得分:6)

查看dateutilmx.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