33

次のようなW3C XML スキーマの日付を解析しようとしています

"2012-05-15T07:08:09+03:00"

これは、 W3C XML スキーマの dateTime仕様の ISO 8601 バージョンに準拠しています。

上記の日付では、タイムゾーン識別子は ですが、それを表すパターンは明らかに存在し"+03:00"ません。SimpleDateFormat

タイムゾーンが の場合、"+0300"(Z大文字) が適用され、SimpleDateFormatパターンは次のようになります。

yyyy-MM-dd'T'HH:mm:ssZ

同様に、タイムゾーンが の場合、"GMT+03:00"(z小文字) が適用され、SimpleDateFormatパターンは次のようになります。

yyyy-MM-dd'T'HH:mm:ssz

(ちなみに、大文字'Z'も機能します)。

では、SimpleDateFormat日付文字列を前処理せずに上記の日付を表すパターンまたは回避策はありますか?

4

9 に答える 9

37

Java 7+ を使用している場合、このパターンが機能するはずです (これXは ISO 8601 タイム ゾーン用です)。

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
于 2012-05-16T08:46:35.257 に答える
26

次のようなものはどうですか:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"){ 
    public Date parse(String source,ParsePosition pos) {    
        return super.parse(source.replaceFirst(":(?=[0-9]{2}$)",""),pos);
    }
};
于 2012-05-16T08:51:35.857 に答える
11

うーん、日付形式は XML 日時データ型形式のように見えますか? XML 日時データ型形式の場合は、javax.xml.datatype.DatatypeFactoryを使用して作成できますXMLGregorianCalendar

DatatypeFactory
  .newInstance()
  .newXMLGregorianCalendar("2012-05-15T07:08:09+03:00");

上記の呼び出しはXMLGregorianCalendar、オブジェクトを使用して のような他の Java 日時オブジェクトに変換できるインスタンスを返しますGregorianCalendar

于 2012-05-16T08:44:26.643 に答える
3

いいえ、SimpleDateFormat文字列を前処理せずにこの形式を理解させるための回避策はありません (たとえば、:文字列から を削除します)。(編集:assyliasが指摘するように、Java 7以降を使用している場合を除く)。

日付と時刻の標準 XML 形式 (ISO 8601) で文字列を解析しようとしているようです。この形式をサポートするJoda Timeライブラリを使用することをお勧めします。

何らかの理由で Joda Time を使用できない、または使用したくない場合は、パッケージのクラスを使用して、javax.xml.datatypeタイムスタンプをこの形式で解析およびフォーマットできます。例えば:

DatatypeFactory factory = DatatypeFactory.newInstance();

// Parses a string in ISO 8601 format to an XMLGregorianCalendar
XMLGregorianCalendar xmlCal = factory.newXMLGregorianCalendar("2012-05-16T10:39:00+03:00");

// Convert it to a regular java.util.Calendar
Calendar cal = xmlCal.toGregorianCalendar();
于 2012-05-16T08:43:16.117 に答える
2

最善の方法は、Joda's を使用することです

org.joda.time.format.ISODateTimeFormat

よろしく、

于 2012-05-16T09:19:34.553 に答える
1

これがうまくいくかどうかはよくわかりません。しかし、ここでは、日付をあるタイムゾーンから別のタイムゾーンに変換する際に試したコードです。コードの一部が役に立ちますように。

public Date convertToUserTimezone(long dateToConvert, String timezoneOffset){
        java.text.DateFormat format = SimpleDateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);/*new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");*/
        // java.util.Calendar cal = Calendar.getInstance(new
        // SimpleTimeZone(0, "GMT+05:30"));
        TimeZone gmtTime = TimeZone.getTimeZone("GMT"+timezoneOffset);


        format.setTimeZone(gmtTime);
        java.util.Date date1 = new Date(format.format(new Date(dateToConvert)));

        return date1;
    }

これがお役に立てば幸いです。乾杯。:)

于 2012-05-16T08:42:00.597 に答える
1

次のようなものを試すことができます:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
Date date = df.parse(stringDate.replaceAll("\\+", "GMT+"));
于 2012-05-16T09:22:54.443 に答える
1

SimpleDateFormat に関しては、利用可能なフォーマット パターンについて既に言及しており、それらはhttp://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.htmlで定義されています。

Date をもっと使いたい場合は、GregorianCalendar がさらに多くのオプションを提供します。

TimeZone zone = TimeZone.getTimeZone(TimeZone.getTimeZone("GMT-8").getID());
GregorianCalendar calendar = new GregorianCalendar(zone);
calendar.setTime(new Date(SomeDate));
于 2012-05-16T09:06:03.787 に答える