相対時間を解析するにはどうすればよいですか?
-
09-06-2019 - |
質問
この質問は、「」という質問の裏返しです。相対時間を計算するにはどうすればよいですか?".
相対的な時間に関する人間の入力が与えられた場合、それをどのように解析できるでしょうか?デフォルトでは、次からオフセットします DateTime.Now()
, 、ただしオプションで別のものからオフセットすることもできます DateTime
.
(C# での回答を推奨します)
入力例:
- 「20分以内に」
- "5時間前"
- 「3時間2分」
- "来週"
編集: 入力に対していくつかの制限を定義できると仮定しましょう。この種のコードは、Web 上に公開すると便利です。
解決
それは、日付を処理するための DSL (ドメイン固有言語) を構築することです。誰かが .NET 用に作成したかどうかはわかりませんが、DSL の構築は非常に簡単です。
- 言語を正確に定義し、どの入力フォームを受け入れるか、曖昧さをどうするかを定義します。
- 言語の文法を構築する
- 言語を解析して実行可能な AST にする有限状態マシンを構築する
それはすべて自分で行うことができます(助けを借りて) ドラゴンブック, 、たとえば)、または次のような効果をもたらすツールの助けを借りて リンク.
可能性について真剣に考えるだけで、優れた UI サンプルの助けを借りて、アプリケーションが受け取る実際の入力の半分以上をカバーできる可能性が十分にあります。人間が入力できるすべてのものを受け入れることを目指す場合は、本質的に曖昧なものがあるため、曖昧であると判断された入力を記録し、解釈できるときにはいつでもそれらを文法に追加できます。
他のヒント
Googleで検索すると出てくるのは、 解析日時 ライブラリ ( チャンドラープロジェクト)、まさにこれを行うように設計されています。これはオープンソース (Apache ライセンス) であり、Python で書かれています。かなり洗練されているようです -- ホームページから:
ParsedateTimeは、以下を解析することができます。
* Aug 25 5pm * 5pm August 25 * next saturday ... * tomorrow * next thursday at 4pm * at 4pm * eod * in 5 minutes * 5 minutes from now * 5 hours before now * 2 days from tomorrow
純粋な Python で実装されており、特別なものは何も使用していないため、互換性がある可能性が高くなります。 アイアンパイソン, .netでも使えるようになりました。特に C# ソリューションが必要な場合は、使用するアルゴリズムに基づいて何かを書くことができます...
また、大量の単体テストも付属しています。
あなたは C# について話しているので、これはあまり役に立たないかもしれませんが、まだ誰も言及していないので、php の優れた完全に非常識なネイティブを見てみることができます。 ストラトタイム 関数
Ruby の人々は、と呼ばれるパーサーを使用してこれに取り組もうとしました。 慢性.
私は最近、著者がこの問題をどのように解決したかについての有益なビデオプレゼンテーションを見ました。
これ: http://www.codeproject.com/KB/edit/dateparser.aspxあなたが達成しようとしていることにかなり近いです。最もエレガントなソリューションではありませんが、確かに作業を節約できるかもしれません。