web-dev-qa-db-ja.com

Javaタイムゾーン付きW3C XML日付のSimpleDateFormatパターン

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

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

W3C XML Schema 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パターンまたは回避策はありますか?

29
PNS

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

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);
    }
};
24
Vlad

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

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
34
assylias

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

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

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

11
Alvin

apache commons DateUtilsを可能なパターンで使用します。例:

private static final String[] DATE_FORMATS = new String[] {
            "yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ssz",
            "yyyy-MM-dd'T'HH:mm:ssZ", "yyyy-MM-ddz", "yyyy-MM-ddZ" };


    public Date parse(String date) {

        Date parsedDate = null;
        try {
            parsedDate = DateUtils.parseDate(date, DATE_FORMATS);
        } catch (ParseException e) {
            logger.error("dates should be in valid format" + e);
            return null;
        }
               return parsedDate;
              }
3
Shailesh Prabhu

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

日付と時刻の標準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();
3
Jesper

最善の方法は、Jodaの

org.joda.time.format.ISODateTimeFormat

よろしく、

2
Peter Rader

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

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
Date date = df.parse(stringDate.replaceAll("\\+", "GMT+"));
1
tibtof

これがあなたのために働くかどうか、私にはよくわかりません。しかし、ここでは、あるタイムゾーンから別のタイムゾーンに日付を変換するときに試したコードを示します。コードの一部が役立つ場合があります。

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;
    }

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

1
Japan Trivedi