9

这可能问得太多了,但是有没有一种语言在表示时间和日期操作方面做得非常出色?我会马上承认,写一个真正伟大的时间库真的很难。也就是说,是否有任何广泛使用的语言?基本上,我想要像现代正则表达式库一样全面地处理时间和日期的东西。到目前为止,我在 Python 和 Java 中看到的所有内容都忽略了一个或多个非常重要的部分,或者使太多事情变得困难。

至少这应该是直观的:

  • 查找两个给定日期之间的天数,两个给定分钟周期之间的分钟数等。
  • 从时间戳中添加和减去间隔
  • 允许在时区之间进行简单转换,并自动考虑按地区划分的夏令时变化(假设有一个准确的区域设置支持数据库可用)
  • 获取给定时间戳所属的周期,给定的周期粒度(“该日期在哪个日历日?”)
  • 支持非常通用的字符串到日期转换(给定一个模式)

此外,如果有 Java 风格的 Calendar/GregorianCalendar 设置,如果我需要推出自己的希伯来语、巴比伦语、托尔金语或火星日历,那么通用 Calendar 类应该适应子类。(例如,Java 日历使这变得毫无意义。)

我在这里完全与语言无关。如果在计算诸如“2002 年和下一个情人节之间有多少分钟?”之类的模棱两可的东西时它会窒息,这很好。

4

15 回答 15

7

.NET 的 DateTime怎么样?(您可以在框架内选择您的语言)

于 2008-09-18T05:37:00.757 回答
4

你在寻找像 PHPs strtotime这样的东西吗?这将为您提供几乎任何您可以扔给它的东西的 unix 时间戳。

从 php 网站:

<?php
echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";
?>

.NET 的日期类需要对DateTimeFormatInfo等进行更神秘的处理,以解析不像 strtotime 可以处理的那样复杂的日期字符串。

自 PHP 5 起,PHP 提供了一个 DateTime 类和一个 DateTimeZone 类,但它们的文档记录都很差。我仍然主要使用 unix 时间戳和datetimestrtotime函数,因为我还没有完全掌握新对象。

以下链接试图更好地充实 DateTime 和 DateTimeZone:

于 2008-09-18T05:41:32.883 回答
3

有一种非常酷的编程语言叫做Frink。它支持几乎所有发明的单位、每一个物理或数学常数、时区、bla bla bla ...</p>

它甚至还有一个Web 界面和一个Java Applet

上面的一些挑战:

  • 查找两个给定日期之间的天数,两个给定分钟周期之间的分钟数等。
    • 离圣诞节还有多少天:# 2008-12-25 # - now[] -> days
    • 离中午多长时间:now[] - # 12:00 # -> minutes
  • 从时间戳中添加和减去间隔
    • 我的百万分钟生日是什么时候:# 1979-01-06 # + 1 million minutes
  • 允许在时区之间进行简单转换,并自动考虑按地区划分的夏令时变化(假设有一个准确的区域设置支持数据库可用)
    • 北京奥运会什么时候在伦敦开始:# 2008-08-08 08:08 PM China # -> London
  • 支持非常通用的字符串到日期转换(给定一个模式)
    1. 定义新的日期格式:### dd.MM.yyyy ###
    2. 解析:# 18.09.2008 #

Frink 与 Java 很好地集成:它可以嵌入到 Java 应用程序中,Frink 程序可以调用 Java 代码

于 2008-09-18T13:32:36.323 回答
3

对于 Java,我强烈推荐Joda Date/Time library

于 2008-09-18T05:51:33.263 回答
3

您可能想检查 CPAN 上的Date::Manip Perl 模块。

于 2008-09-18T05:53:12.543 回答
2

PHP 还不错。

// given two timestamps: $t1, and $t2:

// find the number of days between two given dates, number of minutes
// between two given minute periods, etc.  
$daysBetween = floor(($t2 - $t1) / 86400);  // 86400 = 1 day in seconds
$hoursBetween = floor(($t2 - $t1) / 3600);  // 3600 = 1 hour in seconds

// add and subtract intervals from timestamps  
$newDate = $t1 + $interval;

// allow simple conversion between timezones, with Daylight Saving Time
// changes by region automatically accounted for (given that there's an
// accurate supporting database of regional settings available)

// See PHP's Calendar functions for that
// http://au2.php.net/manual/en/book.calendar.php
// It not only supports basic stuff like timezones and DST, but also
// different types of calendar: French, Julian, Gregorian and Jewish.

// get the period that a given timestamp falls into, given period
// granularity ("what calendar day is this date in?")  
if (date("d", $t1) == 5)    // check if the timestamp is the 5th of the month
if (date("h", $t1) == 16)   // is it 4:00pm-4:59pm ?

// support very general string-to-date conversions (given a pattern) 

// strtotime() is magic for this. you can just type in regular english
// and it figures it out. If your dates are stored in a particular format
// and you want to convert them, you can use strptime()

你必须给它一些荣誉,因为它有一个功能来告诉复活节在给定年份的日期

于 2008-09-18T06:00:50.183 回答
2

对于 C++,有Boost.Date_Time

于 2008-09-18T06:07:42.180 回答
2

为此,我喜欢 .NET。它通过 DateTime 和 Timespan 类提供了良好的日期/时间操作。然而,大多数日期/时间的东西在任何语言中都相当简单,它会给你一个 unix 时间戳来使用。

于 2008-09-18T05:36:05.970 回答
1

我对 PHP 的PEAR Date类非常满意。我相信,除了多个日历之外,它可以完成您所询问的所有事情,尽管还有 Date_Human,它可能是此类事情的模板。

另外,我还没有使用它,但是Zend_Date,也适用于 PHP,看起来它可以很好地满足你想要的大部分内容。Zend_Date 的优点是基于 Unix 时间戳,并且大部分 Zend Framework 类旨在易于扩展。因此,您很可能可以通过扩展 Zend_Date 快速添加对其他日期系统的支持。

于 2008-09-18T13:54:00.217 回答
1

我个人最喜欢的是带有 Rails 的 ActiveSupport 的 Ruby。

start_time = 5.months_ago.at_end_of_week 
end_time =  6.months.since(start_time)

它使用类似的 DSL(领域特定语言)支持您上面提到的所有功能

于 2008-09-18T05:41:13.443 回答
1

我同意 Java SDK 对日期时间库的实现很糟糕。希望JSR 310能在 Java 7 中解决这个问题。如果你等不及 Java 7,我会推荐 JSR-310 的前身 Joda Time。

我同意 ActiveSupport 中的 Ruby on Rails 实现是一个很好的实现,它使基础知识正确。

于 2008-09-18T05:47:44.130 回答
1

PHP Date 函数很棒并且有很多有用的函数(链接:php.net/date

.NET 在其最新版本中还不错,而且我喜欢您可以添加对辅助语言的引用并混合和匹配项目中的代码的事实。因此,您可以在同一个类中使用 C# 和 VB 函数。

于 2009-03-05T11:46:05.977 回答
1

Perl 的 DateTime 库毫无疑问是处理日期时间数学和时区的最佳(最正确的)库。其他一切都在不同程度上是错误的。(我说这是在 PHP 的 DateTime/DateTimeZone 库上写了上面引用的博客文章)

于 2009-01-01T01:58:01.823 回答
1
于 2019-04-12T21:56:01.417 回答
0

实际上,Ruby 有很好的支持。看看这个页面。非常支持将字符串转换为日期、日期转换为字符串、对日期进行数学运算、将“自然语言”字符串(如“本周五 3 个月前下午 3:45”)解析为实际日期、将日期转换为字符串以便您可以做一些事情比如“Sam 最后一次登录是在 4 天前”或其他什么...

非常漂亮。

于 2008-09-18T05:49:43.580 回答