0

最近、Apache POI のライブラリをアップグレードした後、他の API もいくつかアップグレードしました。私が使用した他のライブラリは、すべてのセルの内容を文字列として読み取り、この文字列を解析して日付に変換する必要がありました。

この問題は、ユーザーが日付を dd-mm-yy として入力し始めたときに発生し、年は 00yy AD として表示されました。

のドキュメントによるとSimpleDateFormat

解析では、パターン文字の数が 2 を超える場合、年は桁数に関係なく文字どおりに解釈されます。したがって、パターン「MM/dd/yyyy」を使用すると、「01/11/12」は西暦 12 年 1 月 11 日と解析されます。

では、問題は、2 年よりも 4 年を入力する方がよいかということです。

もう 1 つの質問は、年が 2 文字形式の場合、年を予測する最善の方法は何かということです。年下の解析中に問題が発生するため

Bond Start Date : 12-Jan-98 (1998)
Bond End Date   : 12-Jan-70 (2070)

よろしく、 ハヌマント

4

1 に答える 1

0

あなたが何を求めているのかは明らかではありません。

  1. 2 桁の年 (のみ) を受け入れ、慣習的に解釈する日付形式を指定する方法を尋ねている場合は、 を使用する必要があります"dd-mm-yy"

  2. 2 桁の年を受け入れて慣習的に解釈する日付形式を指定する方法を尋ねている場合、さらに 4 桁 (またはそれ以上) の年を処理する場合は、できません。javadoc にあるように、 を使用する"dd-mm-yyyy"と、2 桁の年は西暦 1 世紀の年として解釈されます。

    考えられる解決策の 1 つは、2 つの形式を使用することです。最初に を使用して解析を試み"dd-mm-yy"、それが失敗した場合は を試し"dd-mm-yyyy"ます。

    しかし、これはハックです...そして、ユーザーが実際に過去の日付を入力する必要がある場合は問題があります.

  3. 何をすべきかを尋ねている場合は、ユーザーが何を意味するかを (効果的に) 推測することを強制する、あいまいなアドホック形式から離れることをお勧めします。

    • ユーザー文字ベースの形式で日付/時刻を入力する必要がある場合は、ISO 8601 形式のいずれかを使用するように要求し、ユーザーが指定した日付/時刻文字列を解析するときに厳密にします。

    • それ以外の場合は、ユーザーに日付ピッカー ウィジェットを提供します。


もう 1 つの質問は、年が 2 文字形式の場合、年を予測する最善の方法は何かということです。

さて、これが問題の核心ですよね!20 世紀には、2 桁の年が何を意味するかは誰もが知っていました。あなたはちょうど正面に19を平手打ちしました。(あぁ…古き良き時代だった!)

ここで、別のヒューリスティックを使用する必要があります。そして、SimpleDateFormat使用するヒューリスティックは、javadoc によって次のように説明されています。

「省略された年パターン ("y" または "yy") で解析するために、SimpleDateFormat は、ある世紀に関連する省略された年を解釈する必要があります。これは、SimpleDateFormat インスタンスの時刻の 80 年前と 20 年後の日付を調整することによって行われます。たとえば、"MM/dd/yy" のパターンと 1997 年 1 月 1 日に作成された SimpleDateFormat インスタンスを使用すると、文字列 "01/11/12" は 2012 年 1 月 11 日と解釈され、文字列 "05 /04/64" は 1964 年 5 月 4 日と解釈されます。"

ヒューリスティックは「今」から80年前から20年後。SimpleDateFormatしたがって、実際には 12-Jan-98 は 1998 年であり、12-Jan-70 は 1970 年です... 「yy」形式の aを使用して解析する場合。

日付に別の意味を持たせる必要がある場合は、別の日付パーサーを使用する必要があります。たとえば、Joda-time ライブラリを使用する場合、「ピボット年」を指定できます。つまり、2 桁の年が該当する世紀の中間年です。

参照:

于 2013-06-26T14:17:17.637 に答える