質問

次のような .NET 日付/時刻パーサーを知っている人はいますか? Ruby のクロニック (「明日」や「来週木曜日の午後 3 時」などを処理します)?

注記:私は Ruby を書いていますが (Chronic についてはそのように知っています)、このプロジェクトでは .NET を使用する必要があります。

役に立ちましたか?

解決

私たちは社内プロジェクトでまさにお客様が求めているものを開発しました。十分な必要性があれば公開したいと考えております。詳細については、このブログをご覧ください。 http://precisionsoftwaredesign.com/blog.php.

ご興味がございましたら、お気軽にお問い合わせください:contact@precisionsoftware.us

このライブラリは現在、SourceForge プロジェクトです。ページは次の場所にあります。

http://www.SourceForge.net/p/naturaldate

アセンブリはダウンロード セクションにあり、ソースは Mercurial で入手できます。

他のヒント

知りませんが、という Java ポートがあります。 慢性的な. 。少なくとも、それはあなた自身の良い出発点となるでしょう。あるいは、次のような半自動 Java から C# へのトランスレーターを使用することもできます。 タコ 翻訳を助けるために。(誰かが何か知っていれば、もっと良いものもあります。)

さて、別の可能な方法:を使用して慢性的なコードを使用できますか 鉄ルビー?

Chronic の .NET ポートが存在します。見る https://github.com/robertwilczynski/nChronic. 。いくつかの改善とバグ修正を加えたフォークを作成しました。ここにあります。 https://github.com/dorony/nChronic (プルリクエストを送信しましたが、作成者はまだ応答していません)。

@ブレア・コンラッド – 良いアイデアですね!IronRuby で Chronic を実行しようとしましたが、依存関係でいくつかの問題が発生しました。まだ準備ができているかどうかはわかりません。

でプロジェクトを見つけました コードプレックス (DateTime英語パーサー)同じことをしようとしています。まだ何年も時間もかかりませんが、良いスタートです。私はこのプロジェクトに少し取り組み、書かれた数字をより適切に処理するためのパッチを提供しました。

これは興味深い問題であり、正規表現をより深く理解するのに間違いなく役立ちましたので、引き続き取り組んでいきたいと思います。

ありました 似たようなスレッド 以前に、あなたが望むことを行うと思われるCodeProjectのライブラリへのリンクを提供しました。 http://www.codeproject.com/KB/edit/dateparser.aspx しかし残念なことに、このライブラリは MFC で書かれているようですので、そこから DLL を作成して、.NET プログラムから呼び出す必要があります。

Palmsey さん、私もつい最近同じ要求があったので、簡単なパーサーを作成してみました。あまり優れたコードではありませんが、次のような処理を行います。

「今日の午後2時」「火曜日午後2時 - 2010年7月15日午前2時」「前年の午前2時 - 2010年7月18日午後2時45分」

おそらく他の誰かが役立つと思うので、codeplex に貼り付けてください。それをチェックしてください: http://timestamper.codeplex.com/

いくつかのフレームワークとPythonをチェックしました 解析日時 最高に働きました。IronPython を使用して .NET から使用できます。

完全なサンプル プロジェクトに興味がある人は、回答にコメントしてください。作成してみます。

編集

リクエストに応じて、ライブラリで使用できる簡単なプロジェクトを次に示します。

http://www.assembla.com/code/relativedateparser/subversion/nodes

たとえば、次の使用例を試してください。

  • 2008 年 8 月 25 日
  • 2008 年 8 月 25 日
  • 8月25日午後5時
  • 8月25日午後5時
  • 次の土曜日
  • 明日
  • 次の木曜日の午後4時
  • 午後4時に
  • エオド
  • 明日は
  • 火曜日
  • オイ
  • オム
  • 5分以内に
  • 今から 5 分後
  • 今から5時間前
  • 正午の2時間前
  • 明日から2日間

私はそれを知りませんでしたが、素晴らしい問題のように思えたので、これに私が取り組んだ方法を示します (VB.NET)。

Private Function ConvertDateTimeToStringRelativeToNow(ByVal d As DateTime) As String
    Dim diff As TimeSpan = DateTime.Now().Subtract(d)
    If diff.Duration.TotalMinutes < 1 Then Return "Now"

    Dim str As String
    If diff.Duration.TotalDays > 365 Then
        str = CInt(diff.Duration.TotalDays / 365).ToString() & " years"
    ElseIf diff.Duration.TotalDays > 30 Then
        str = CInt(diff.TotalDays / 30).ToString() & " months"
    ElseIf diff.Duration.TotalHours > 24 Then
        str = CInt(diff.Duration.TotalHours / 24) & " days"
    ElseIf diff.Duration.TotalMinutes > 60 Then
        str = CInt(diff.Duration.TotalMinutes / 60) & " minutes"
    Else
        str = CInt(diff.Duration.TotalMinutes).ToString() & " minutes"
    End If
    If str.StartsWith("1") Then str = str.SubString(0, str.Length - 1)
    If diff.TotalDays > 0 Then
        str &= " ago"
    Else
        str &= " from now"
    End If
    Return str
End Function

実際には、既存のものほど洗練されていませんが、おそらく問題なく動作すると思います。良い拡張メソッドになるかもしれません。

@バートン:少なくともリンク先のページの例からすると、彼は別の意味で言ったのだと思います。

  Chronic.parse('tomorrow')
    #=> Mon Aug 28 12:00:00 PDT 2006

  Chronic.parse('monday', :context => :past)
    #=> Mon Aug 21 12:00:00 PDT 2006

  Chronic.parse('this tuesday 5:00')
    #=> Tue Aug 29 17:00:00 PDT 2006

気づくまでは私も挑戦してみようと思ってました!(実装は良いですが)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top