7

私は解決できない頑固な問題に遭遇しました。私はstackoverflowで解決策を探し、Javaの日付フォーマットに関する多くの投稿を見つけましたが、私が抱えている問題に固有のものは何もありません.

基本的に、日付文字列を java.util.Date オブジェクトに変換する必要がある状況があります。Date および SimpleDateFormat クラスを使用しています。私が遭遇したほとんどの日付では、問題なく動作します。ただし、一部の日付では機能しますが、実際の日付が変更されます。2 つの日付の例:

Fri Feb 24 16:45:40 PST 2012 --> 変更されます --> Fri Jan 06 16:45:40 PST 2012

Wed Jun 13 10:00:42 PDT 2012 --> に変更 --> Wed Jan 04 09:00:42 PST 2012

日付が変更される理由は何か分かりますか? これを簡単に回避する方法、または別の方法で行う方法はありますか? 私のコードを以下にコピーします。私が話していることを確認するためにそれを試すことができます。

前もって感謝します!

これは、次の JSP コードで試すことができます。

<%@ page import="java.util.*" %>
<%@ page import="java.net.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.text.*" %>

<%
String dateStr = "";
Date tmpDate = null;
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z YYYY");

System.out.println("First Test ---------------");
dateStr = "Fri Feb 24 16:45:40 PST 2012";
tmpDate = (Date) formatter.parse(dateStr);
System.out.println("Original:"+dateStr+":");
System.out.println("Date Obj:"+tmpDate.toString()+":");

System.out.println("Second Test --------------");
dateStr = "Wed Jun 13 10:00:42 PDT 2012";
tmpDate = (Date) formatter.parse(dateStr);
System.out.println("Original:"+dateStr+":");
System.out.println("Date Obj:"+tmpDate.toString()+":");

%>

次の出力が得られます。

First Test ------------
Original:Fri Feb 24 16:45:40 PST 2012:
Date Obj:Fri Jan 06 16:45:40 PST 2012:
Second Test -----------
Original:Wed Jun 13 10:00:42 PDT 2012:
Date Obj:Wed Jan 04 09:00:42 PST 2012:
4

2 に答える 2

8

フォーマット文字列には YYYY ではなく yyyy を使用してください。

YYYY は非常に特別なもので、カレンダーの週の年です。

詳細については、SimpleDateFormatドキュメントを参照してください。

于 2013-02-07T02:44:57.077 に答える
3

週年であるフォーマット指定子でYYYYを使用しています(SimpleDateFormatを参照)。ちょうど「年」であるyyyyが必要です。

週の年の「機能」ではない月と日も指定したため、間違った結果が出たのではないかと思います。週の年を使用する場合は、「週の年」と「曜日」を指定すると、より賢明な結果が得られる可能性がありますが、実際には週の年を使用するつもりはありませんでした。

コードでロケールを指定することをお勧めします。もちろん、それはあなたのマシン上で完全に動作しますが、中国のような他の場所で解析できない日付例外を引き起こす可能性があります。

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
于 2013-02-07T03:30:05.393 に答える