不同编程语言中的库如何处理日期和时间,时间戳和持续时间,Leapseconds&-years,DST和Timezones,......?

soc*_*soc 22 c# python language-agnostic time date

是否有标准的机构或特定的规范方式如何在实践中实现与时间相关的事情(如ICU与Unicode相关的任务),或者这是目前的"尽力而为",取决于多少努力,时间和金钱语言和图书馆实施者想要花钱?

是否有一个具体而完整的实施可以作为如何处理与时间有关的事情的一个例子?

你认为哪个现有的图书馆是一个坏的,体面的或好的例子?

soc*_*soc 17

我将尝试使用可能成为Java 7一部分的Java库来回答第二个和第三个问题.

javax.time.*(JSR 310)

这些类是JodaTime的完全重写,试图修复util.Date/ util.Time和JodaTime 的设计缺陷.

JSR 310试图提供一个全面的日期和时间模型,它是类型安全的和自我记录的.它可与现有类互操作,但也可考虑基于XML和DBMS的用例.这些类是最终的,不可变的,线程安全的,并且在构造之后不能修改.实例是通过一组丰富的Factory方法创建的,这些方法可以在后台缓存内容.

LocalDate dateToday     = LocalDate.of(2010, 9, 14);
LocalDate oneMonthLater = dateToday.with(OCTOBER);
LocalDate oneYearLater  = dateToday.withYear(2011);
Run Code Online (Sandbox Code Playgroud)

API有一些"面向机器"的类和一些"以人为本"的类:

面向机器

Instant

对于与Unix或Java时间戳相当的时间点.实际上有Instant,TAIInstant并且UTCInstant使人们能够准确地选择他们需要的时间定义,即"基于日","线性,无闰秒"等.

Duration

不一定与特定日期或日历相关联的时间范围.

以人为本

有一个丰富的类集合处理不同的用例,如Date-only,Time-only,Time and Date,有和没有Timezones,有和没有DST.

DateProvider

OffsetDate,LocalDate(java.sql.Date兼容性)

TimeProvider

OffsetTime,LocalTime(java.sql.Time兼容性)

DateTimeProvider

ZonedDateTime,OffsetDateTime,LocalDateTime(,java.util.GregorianCalendar兼容性)

InstantProvider

Instant,ZonedDateTime,OffsetDateTime(,java.util.Date兼容性)

Period

期间表示可以从日期/时间加上和减去的"5天"的时间跨度.

Matcher

匹配器启用查询,例如"这是2006年的这个日期吗?" 或"这一天是今年的最后一天".

Adjuster

如果您想要进行更复杂的更改,例如"给我这个月的最后一天!",调节员会来救援.或者"圣诞节后的第二个星期二,拜托!".

Resolver

解析器允许用户定义在特定日期无效时应该发生的情况,例如2010年2月31日:

DateResolver previous = DateResolvers.previousValid();
LocalDate date = date(2010, 2, 30, previous);
// date = 2010-02-28
Run Code Online (Sandbox Code Playgroud)

使用Timezone和DST数据

可以序列化这些类,并使用当前时区数据或序列化时区数据对它们进行反序列化.此外,可以比较来自不同时区的规则:可以找出DST规则是否已经改变,例如在伦敦或莫斯科的日期版本2010e和2010f之间,并决定如果时间在间隙或重叠中应该做什么.

日历系统

虽然一切都基于ISO-8601,但提供了希伯来语,Hijrah,日语,ThaiBuddist等时间系统的简单日历.

格式化和解析

toString()返回ISO8601,SimpleDateFormat支持类似于更高级的模式.

积分

  • 数据库
  • JodaTime
  • 旧版JDK课程(java.util.*)
  • XML

参考文献:


Gen*_*нин 11

有时间和日期(日历)
第一个问题是日期与时间无关,而与厄尔,月亮等的天文位置有关.+人类活动的规律性/周期性.时间也是主观的,相对的,甚至是相对论的,并且可以是天文学上的,也可以是原子的.

时间机构和日期/日历机构
国际标准化组织(ISO) [4]已经发布

  • "ISO 8601数据元素和交换格式 - 信息交换 - 日期和时间的表示"[4a]

与其他国际标准一样,它是建议性的,并以已经建立的做法为基础.
它(主观地)仅基于格里高利历[5]和预知日历(在实际发明之前向后投射,因此在处理历史日期时用途有限)[5a].

世界日历协会[1d]自2012年开始引入新的世界日历[1b-1d],这将使无用的现有日期库成为现实.同样,同样的主要问题,请进一步查看.

我曾经看到,IT系统中与日期时间相关的比较最多的是[2] BIG8 DBMS(IBM DB2,Informix,Ingres,InterBase,Microsoft SQL Server,MySQL,Oracle和Sybase).
这个和所有其他调查显示,相同的处理,例如,公历日历时间/日期在所有系统之间以及在相同平台内(在不同产品和相同产品的版本之间)是不同的,参见例如. ,[3].

所有系统中所有日期/时间库的主要问题是框架的日期/时间数据类型不允许在日期/时间数据类型中包含地理和日历信息.
没有它,它们主要是半无用的 - 7世纪SQL Server datetime2值的毫秒意义是什么?当时甚至没有时钟测量时间,准确度为分钟(Galileo Galilei使用,例如,他的心跳测量他的实验中的时间间隔)以及格里高利历甚至没有被发明.

因此,大量的日期时间类型空间被滥用,未能通过链接并将其与地理和/或日历信息相关联来提供处理日期的最重要的灵活性.

只是快速插图:

  • 现代俄罗斯采用公历和俄罗斯东正教会使用由俄罗斯许多国家假期确定儒略历(例如,圣诞节在俄罗斯是每年1月和旧新年的第7次是在一月的14日通过,而日期公历其他宗教节日相对于格里高利历而言是浮动的.
  • 在1917年以前的俄罗斯,波兰作为其一部分,使用格里高利历,而所有其余的俄罗斯使用朱利安历法(在"相同"时区浮动差异为13-18天)[5b];
  • 双击MS Windows中的时钟(或打开控制面板 - >日期和时间) - >时区选项卡 - >在组合框中查看时区.你会看到,有25个小时内从格林尼治标准时间12:00至GMT + 13:00跨时区的一百与像GMT + 5小时分数:00,GMT + 5:30,GMT + 5:45等.

====引:
[1]新世界日历
[1A] 更新:对不起,不读[1A],笔者困惑日历和写本新闻简短的错误信息
世界日历2012:一个月35天
的http:// www.panorama.am/en/society/2010/01/29/newcalendar

[1B] http://en.wikipedia.org/wiki/World_Calendar
[1C] http://www.theworldcalendarin2012.org/Index2.htm
[ 1d] http://www.theworldcalendar.org/TWCA.htm

[2] Peter Gulutzan,Trudy Pelzer.SQL性能调优:SQL中的日期
http://www.informit.com/articles/printerfriendly.aspx?p=30939

[3] SqlDateTime.MinValue!= C#DateTime.MinValue,为什么?
SqlDateTime.MinValue!= DateTime.MinValue,为什么?

[4]
国际标准化组织
http://en.wikipedia.org/wiki/International_Organization_for_Standardization
[4A] ISO 8601数据元和交换格式-信息交换-日期和时间的表示
http://en.wikipedia.org/wiki/ISO_8601

[5]
公历
http://en.wikipedia.org/wiki/Gregorian_calendar
[5α] Proleptic公历
http://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar
[图5b]公历通过
HTTP://en.wikipedia .org/wiki/Gregorian_calendar#Adoption
[6]
http://en.wikipedia.org/wiki/Galileo_Galilei

  • 很棒的解释!只要我能开始另一个赏金,我就会给你积分.谢谢! (2认同)

Ste*_*mis 10

我认为目前这种情况没有单一的标准,但是有多种标准可以符合这些标准:例如ISO 8601.

ICU自己的日期/时间处理是一种跨语言(C/C++和Java)和多平台库.

它在内部处理日期和时间,通常使用一次UDate(C/C++)或java.util.Date/long(Java),自1-1-1970以来的毫秒数,或者一个Calendar对象,特定于日历的类型(Gregorian vs Hijri等).持续时间可用于格式化.闰年计算为日历系统的一部分,并假设闰秒由底层操作系统处理.DST /时区数据保持最新,其中"tz数据库"有时由其作者姓氏Olson引用.

希望这已经回答了一些关于ICU的问题.


Ste*_*pel 7

我有一段时间没用过它,但从过去的经验来看,我说Boost.Date_Time是一个很好的例子.

虽然可能不是当今许多快节奏项目的首选,但C++的表现力似乎仍然非常适合日期/时间等复杂问题领域,因此结合高质量的同行评审流程来成为官方Boost C++库我希望手头的库可以作为如何处理与时间相关的事情的一个例子,尽管不是一个完整的实现,见下文.

提升日期时间

该库记录非常好,所以我可能从组合报价全部答案,但我会尽量根据建议的模板来提取一些片段SOC的答案,而不是-但是我要开始与整个报价:

动机

这个库的动机来自于在几个项目中使用并帮助构建多个日期时间库.[...]

使用日期和时间进行编程应该与使用字符串和整数进行编程一样简单和自然.通过拥有一组强大的运算符和计算功能,可以从根本上简化具有大量时态逻辑的应用程序.类应该能够比较日期和时间,添加长度或持续时间,从时钟中检索日期和时间,并自然地使用日期和时间间隔.

域概念

该库支持3种基本时间类型:

  • 时间点 - 时间连续体中位置的说明符.
  • 时间持续时间 - 未连接到时间连续体上任何点的时间长度.
  • 时间间隔 - 连接到时间连续体中特定点的持续时间.也称为时间段.

计算

您可以在" 详细信息 - 计算"部分中获得关于域概念如何相互关联的非常直观的概述.

约束

我最初评估图书馆的决定的一个重要部分是设计目标的可用文档和根据复杂问题领域的必要权衡,这似乎概述了已经放入图书馆的现实世界专业知识 - 您可以阅读更多关于它在以下两个部分:

使用Timezone和DST数据

完全支持所有可以想到的计算和转换,就我而言 - 请参阅示例部分中的标题以获得初步印象.

日历/时间系统

这绝对是关于您的规范的弱点,尽管库是专门设计的,具有可扩展性:

该库的大部分起源是观察到很少的日期时间库以允许定制和扩展的方式构建.一个典型的例子,日历逻辑直接构建在日期类中.或者时钟检索功能直接构建在时间类中.这些设计决策通常使得无法扩展或更改库行为.在更基础的层面上,通常有关于时间表示或格里高历的解决方案的假设.

但是,我不知道其他日历/时间系统的任何实现,而不是包含的日历/时间系统的实现,请参阅当前实现的库参考:

  • 约会时间
  • 阳历
  • Posix时间
  • 当地时间

格式化和解析

由于底层C++ I/O系统各自的强大功能,完全支持这是库的一个优点,请参阅日期时间输入/输出 - 面向流的C++ I/O具有优点和问题,具体取决于您的需求和期望,但本主题在本网站的其他地方讨论.

积分

这被提供,以及经由与兼容性升压序列化,这是归档取向虽然,通常意思是二进制数据,文本数据,XML的文件左右; 即JSR 310示例中未明确支持数据库.