6

日付の表現を含む文字列があります。次のようになります。

2006 年 11 月 30 日木曜日 19:00:00 EST

SimpleDateFormat を使用して Date オブジェクトを作成しようとしていますが、2 つの問題があります。

1.) ソリューションを SimpleDateFormat コンストラクターにハードコーディングするパターンがわかりません

2.) API を使用して文字列を解析してパターンを特定する方法が見つからないため、これをさまざまな日付出力パターンに再利用できます。

API またはカスタム ソリューションを使用したソリューションを知っている人がいれば、大変感謝しています。

4

11 に答える 11

8

SimpleDateFormat に渡す形式は、http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.htmlで調べることができます。

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy")

2 番目の質問については、日付形式を特定し、その形式を事前に知らずに解析する Java ライブラリを知りません。

于 2008-09-04T14:21:12.283 に答える
3

POJava 日付パーサー org.pojava.datetime.DateTime は、複数の言語、タイム ゾーン、および形式をサポートする不変の堅牢なパーサーです。

何よりも、パーサーはヒューリスティックであり、動作するために既存の「フォーマット」を必要としません。日付/日時のテキスト文字列を渡して、java.util.Date を取得するだけです。

于 2009-07-09T07:29:48.390 に答える
2

指定した日付形式は任意のものではないことを知っておく価値があります。これは、組み込みのDate.toString()メソッドの出力です(少なくとも英国と米国のロケールでは)。偶然ではありませんが、これはunixの「date」コマンドの形式でもあります(少なくともLinuxでは、他の実装も信じています)。 UNIXの日付はそうではありません。

これが意味するのは、フォーマットされていない日付をユーザーが変更可能なフィールド(HTML INPUTフィールドなど)に出力し、変更せずに受け取ると、この入力フォーマットを受け取る可能性が高いということです。したがって、入力がこの形式で行われるからといって、ユーザーが他の1000の任意の形式で入力することを意味するわけではありません。

もちろん、彼らはまだそうかもしれません。私が一般的に日付入力を処理する方法は、たくさんのtry / catchブロックを使用することです。そこでは、ある形式、次に別の形式、次に別の形式に対して試行します。現在、標準フレームワークはデフォルトで最大約20の異なる形式になっています。もちろん、それはまだ完璧ではありません。先日、日付として「03 Sept」と入力している人を見つけました(非標準の月の省略形で、年はありません)。そのシナリオは処理していませんでした。

于 2008-09-05T00:25:19.820 に答える
2

日付を解析またはフォーマットする以外のことをしたい場合、パターン自体を処理する方法はあまりありません。少し前に、書式設定されたテキスト フィールドに日付を入力するための Swing コンポーネントを作成していました。パターンを指定すると、テキスト入力カーソルがそのパターンの要素に移動し、有効な値のみが許可されました。

その一環として、OpenHarmonise オープン ソース プロジェクトの一部としてここで入手できるDateFormatParser を作成しました。

日付をパターンに解析することは、非常に興味深い問題です。特定の仮定を行う必要があります (たとえば、 : の使用は日付ではなく時間です) が、2 桁の年と、日/月または月/日の配置という永遠の問題に直面することになります。

于 2008-09-04T14:34:27.043 に答える
2

Apache Commons のDateUtilsを参照してください。parseDateあなたと複数のパターンを試してインスタンスStringを吐き出す方法があります。Date

于 2008-09-05T03:03:54.573 に答える
2

日付を解析してそのパターンを解決する簡単な方法があるかどうかはわかりませんが、投稿したパターンは次のようになると思いました。

EEE MMM dd HH:mm:ss zzz yyyy

于 2008-09-04T14:19:29.713 に答える
1

他の質問は非常に興味深いと思います。ただし、重大な問題が 1 つあります。これを解析してください: 08/07/06! 予想される形式のサブセットに自分自身を制限すると、正規表現をいじって問題を解決できる可能性があります。予想されるパターンの束を構築し、スペースなどで文字列を分割し、部分的に一致させることができます。

于 2008-09-04T21:20:19.640 に答える
1

他の人が言ったように、パターンは本来あるべきように見えます

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"

任意の形式の日付の解析に関しては、Java でこれを行うライブラリを知りません。あなたがそのようなものを開発することに熱心なら、私は perl のstr2time関数を調べることから始めます。

于 2008-09-04T14:26:39.230 に答える
0

これは実際には同じではありませんが、日付に対して自然言語処理を実行できるJChronicのようなものを見たいと思うかもしれません。したがって、入力日は「明日」や「次の火曜日から 2 週間後」などの日付になります。

これはあなたのアプリケーションにはまったく役に立たないかもしれませんが、そうかもしれません。

于 2008-09-04T14:45:43.177 に答える
0

その特定の日付のパターンを求めているだけですか? もしそうなら、私はこれがそれを行うべきだと思います:

"EEE MMM d HH:mm:ss z yyyy"

または、フォーマットされた日付を取り、フォーマットを推測して解析しようとしていますか?

于 2008-09-04T14:20:02.757 に答える
0

どうですか:

EEE MMM dd HH:mm:ss zzz yyyy

文字列を SimpleDateFormat のコンストラクターに渡すだけです。オブジェクトを使用するには、日付に変換する文字列を渡す parse メソッドを呼び出すだけです。

あなたは見てみることができます:

http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html

于 2008-09-04T14:27:04.207 に答える