日期,时间和日历操作真的能使用哪种语言?

时间:2020-03-06 14:20:06  来源:igfitidea点击:

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

至少这样做应该很直观:

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

此外,如果有Java风格的Calendar / GregorianCalendar设置,则如果我需要滚动自己的希伯来语,巴比伦语,Tolkien或者MartianCalendar,则一般Calendar类应适应子类。 (例如,Java日历使这一点变得毫无意义。)

我在这里完全不懂语言。如果事情在计算诸如" 2002年到下一个情人节之间有多少分钟?"之类的含糊不清的内容时引起问题,那很好

解决方案

我喜欢.NET。它通过DateTime和Timespan类提供了良好的Date / Time操作。但是,大多数日期/时间资料在任何语言中都非常简单,可以为我们提供一个unix时间戳。

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

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

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

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

我们是否在寻找类似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时间戳以及日期,时间和strtotime函数,因为我还没有完全掌握新对象。

以下链接试图使DateTime和DateTimeZone更好一些:

  • http://laughingmeme.org/2007/02/27/
  • http://maetl.coretxt.net.nz/datetime-in-php

另外:我想知道在考古等领域中使用哪种日期数据类型!如何代表时间轴小程序的历史日期?

我同意Java SDK具有可怕的datetime库实现。希望JSR-310将在Java 7中解决此问题。如果我们迫不及待要使用Java 7,我将推荐JSR-310的前身Joda Time。

我同意ActiveSupport中的Ruby on Rails实施是一种出色的实施,它使基础知识正确。

实际上,Ruby具有出色的支持。签出此页面。真正强大的支持,可将字符串转换为日期,将日期转换为字符串,对日期进行数学运算,将"自然语言"字符串(如" 3个月前的这个星期五下午3:45"解析为实际日期),将日期转换为字符串以便进行操作例如" Sam上次登录是4天前"或者其他任何内容。

很漂亮

对于Java,我强烈推荐Joda日期/时间库。

我们可能要检查CPAN上的Date :: Manip Perl模块。

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()

我们必须给它一些荣誉,因为它具有告诉特定年份复活节的日期的功能。

对于C ++,有Boost.Date_Time。

有一种很酷的编程语言,叫做Frink。它支持几乎所有已发明的单元,每个物理或者数学常数,时区,等等。

它甚至具有Web界面和Java Applet。

上面的一些挑战:

  • 自中午以来已经过了多久:`now []-#12:00#->分钟
  • 解析:#18.09.2008#

Frink与Java集成良好:它可以嵌入Java应用程序中,而Frink程序可以调用Java代码。

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

另外,我还没有使用它,但是Zend_Date(同样适用于PHP)看起来似乎可以很好地满足大部分需求。 Zend_Date具有基于Unix时间戳的优势,并且大量Zend Framework类旨在易于扩展。因此,很可能我们可以通过扩展Zend_Date快速添加对其他日期系统的支持。

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

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

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