9

これはおそらく質問するには多すぎますが、時刻と日付の操作を表すという本当に素晴らしい仕事をする言語はありますか?本当に素晴らしいタイムライブラリを書くのは本当に難しいことをすぐに認めます。そうは言っても、それを持っている普及した言語はありますか?基本的に、私は、現代の正規表現ライブラリがその仕事をするのと同じくらい包括的に時間と日付を処理するものが欲しいです。PythonとJavaでこれまでに見たものはすべて、1つ以上の非常に重要な部分を省略しているか、非常に多くのことを困難にしています。

少なくとも、これは直感的に実行できる必要があります。

  • 2つの指定された日付の間の日数、2つの指定された分の期間の間の分数などを見つけます。
  • タイムスタンプから間隔を加算および減算します
  • 地域ごとの夏時間の変更が自動的に考慮され、タイムゾーン間の簡単な変換が可能になります(地域設定の正確なサポートデータベースが利用可能である場合)
  • 特定のタイムスタンプが該当する期間、特定の期間の粒度を取得します(「この日付は何暦日ですか?」)
  • 非常に一般的な文字列から日付への変換をサポートします(パターンが与えられた場合)

さらに、JavaスタイルのCalendar / GregorianCalendarセットアップがある場合、自分のヘブライ語、バビロニア語、トールキン、またはMartianCalendarをロールする必要がある場合は、一般的なカレンダークラスがサブクラスに対応している必要があります。(たとえば、Javaカレンダーはこれを無意味に難しくします。)

私はここでは完全に言語に依存していません。「2002年から次のバレンタインデーまでの間に何分あるのか」などのあいまいなものを計算することに問題があれば問題ありません。

4

15 に答える 15

7

.NETのDateTimeはどうですか?(フレームワーク内で言語を選択できます)

于 2008-09-18T05:37:00.757 に答える
4

PHP の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 の日付クラスは、strtotime が処理できるほど複雑ではない日付文字列を解析するために、DateTimeFormatInfoなどを使用してはるかに難解な操作を行う必要があります。

PHP は、PHP 5 の時点で DateTime クラスと DateTimeZone クラスを提供していますが、どちらも文書化されていません。新しいオブジェクトを完全に把握していないため、私はまだ主に UNIX タイムスタンプとdatetime、およびstrtotime関数を使用しています。

次のリンクは、DateTime と DateTimeZone をもう少し充実させようとしています。

于 2008-09-18T05:41:32.883 に答える
3

Java の場合、Joda Date/Time ライブラリを強くお勧めします。

于 2008-09-18T05:51:33.263 に答える
3

CPAN のDate::Manip Perl モジュールを確認することをお勧めします。

于 2008-09-18T05:53:12.543 に答える
3

Frinkと呼ばれる非常に優れたプログラミング言語があります。これまでに発明されたほぼすべての単位、すべての物理定数または数学定数、タイムゾーン、bla bla bla …</p>

Web インターフェイスJava アプレットも備えています。

上記のいくつかの課題:

  • 指定された 2 つの日付の間の日数、指定された 2 つの分期間の間の分数などを見つけます。
    • クリスマスまであと何日:# 2008-12-25 # - now[] -> days
    • 正午からの経過時間:now[] - # 12:00 # -> minutes
  • タイムスタンプから間隔を加算および減算する
    • 私の100万分の誕生日はいつでしたか:# 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 に答える
2

このために.NETが好きです。これは、DateTimeクラスとTimespanクラスを使用して、適切な日付/時刻操作を提供します。ただし、ほとんどの日付/時刻は、どの言語でもかなり単純であり、UNIXタイムスタンプを使用できます。

于 2008-09-18T05:36:05.970 に答える
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 に答える
1

PHP 用のPEAR Dateクラスには非常に満足しています。複数のカレンダーを除いて、あなたが求めているすべてのことを実行すると思いますが、その種のテンプレートになる可能性のある Date_Human もあります。

また、私はまだそれを使っていませんが、同じくPHP 用のZend_Dateは、必要なもののほとんどでうまく機能するようです。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 の datetime ライブラリの実装がひどいことに同意します。Java 7 でJSR 310がこの問題を修正することを願っています。Java 7 が待ちきれない場合は、JSR-310 の前身である Joda Time をお勧めします。

ActiveSupport での Ruby on Rails の実装は、基本を正しく理解した優れた実装であることに同意します。

于 2008-09-18T05:47:44.130 に答える
1

Perl の DateTime ライブラリは、日時計算とタイムゾーンを処理するための最良の (最も正確な) ライブラリであることは間違いありません。他のすべては、さまざまな程度で間違っています。(そして、PHP の DateTime/DateTimeZone ライブラリに関する上記の参照ブログ投稿を書いたので、これを言います)

于 2009-01-01T01:58:01.823 に答える
1

PHP Date 関数は素晴らしく、便利な機能がたくさんあります (リンク: php.net/date )

.NET は最新のリリースでは悪くありません。さらに、二次言語への参照を追加して、プロジェクトのコードを組み合わせて一致させることができるという事実が気に入っています。したがって、同じクラス内で C# と VB の関数を使用できます。

于 2009-03-05T11:46:05.977 に答える
0

実際、Ruby には優れたサポートがあります。このページをご覧ください。文字列を日付に変換したり、日付を文字列に変換したり、日付の計算を行ったり、「3 か月前の今週の金曜日の午後 3 時 45 分」などの「自然言語」文字列を実際の日付に解析したり、日付を文字列に変換したりするための本当に優れたサポート「サムが最後にログインしたのは 4 日前」など...

とても気の利いた。

于 2008-09-18T05:49:43.580 に答える