6

SimpleDateFormatを使用してISO8601の日付と時刻を解析するときに、奇妙な問題が発生します。関連するコードは次のとおりです。

public class DateHelper
{
    private static SimpleDateFormat iso8601formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
    public static Date parseISO8601(String date) throws ParseException
    {
        Date result = iso8601formatter.parse(date);
        return result;
    }
}

入力のために私はそれに文字列を与えています

2010-09-06T15:30:00+02:00

そして、戻り値として、日付が2010年1月6日に設定され、時刻が13:30、タイムゾーンがGMT + 00:00のDateオブジェクトを取得します。

編集:私も「2010-09-06T15:30:00 + 0200」を使用してみましたが、同じ結果になりました。

紛らわしいのは、設定された日付が部分的に正しいこと、月だけが間違って設定されていることです。

この問題はAndroid1.6とAndroid2.2で発生します。

どうすれば修正できますか?

4

5 に答える 5

6

mmの代わりに for monthを使用すると、問題を再現できますMM

したがって、問題の原因はそこにあり、実行していると思われるバージョンのコードを実行していないのではないかと思います。質問にあるように、コードを再コンパイルして再実行します。あたりです。

于 2010-11-07T13:30:19.413 に答える
2

おそらく問題ではありませんが、SimpleDateFormatはスレッドセーフではないため、コードを次のように変更する必要があります。

public class DateHelper
{
    public static Date parseISO8601(String date) throws ParseException
    {
        return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(date);
    }
}
于 2010-11-06T16:06:31.387 に答える
2

ParseExceptionを処理していますか?コードは、その入力文字列に対してParseExceptionをスローする必要があります。
Androidについてはわかりませんが、Java6では入力文字列2010-09-06T15:30:00+02:00が無効です。

+02:00は有効なタイムゾーンではありません。
コロンなしで試してください:

    2010-09-06T15:30:00+0200  

トリック(テスト)は、DateFormatを使用して日付をフォーマットし、作成された文字列を確認することです 。

    System.out.println(iso8601formatter.format(new Date()));  
于 2010-11-06T17:26:03.323 に答える
1

私は1.6プロジェクトを作成し、コードはうまくいきました...

public class DateHelper {
    private static SimpleDateFormat iso8601formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

public static Date parseISO8601(String date) throws ParseException {
    Date result = iso8601formatter.parse(date);
    return result;
}

public static String makeISO8601String(Date date) {
    return iso8601formatter.format(date);
}

}

public class StackOverflowTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

    TextView textView = (TextView)this.findViewById(R.id.textView);

    StringBuilder builder = new StringBuilder();
    try {
        String badDateString = "2010-09-06T15:30:00+0200";
        Date parsedDate = DateHelper.parseISO8601(badDateString);
        builder.append(badDateString).append("\n");
        builder.append(parsedDate.toString()).append("\n");
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    String dateString = DateHelper.makeISO8601String(new Date());
    builder.append("now="+dateString).append("\n");

    textView.setText(builder.toString());
}

}

私にとっては、次のように出力されます。

2010-09-06T15:30:00+0200
Mon Sep 06 06:30:00 PDT 2010
now=2010-11-06T14:41:55-077

私にとってどれが正しい...

于 2010-11-06T21:45:35.603 に答える
0

最初の文字列を解析するには、uが使用する必要があります

public static Date parseDateFromString(String aDateString){
    SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
    Date date=null;
    try {
        date= inputFormat.parse(aDateString);
    } catch (ParseException e) {
        return null;
    }
    return date;

+02:00のようにタイムゾーンを解析する場合、Zではなくzを使用します。お役に立てば幸いです。+00:00を与えることに関する問題は、あなたが使用するロケールに関連していると思います。別のロケールでテストしてみてください。

于 2010-11-07T13:13:12.450 に答える