次のような 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
パターンまたは回避策はありますか?
次のようなものはどうですか:
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);
}
};
Java 7+を使用する場合、このパターンは機能するはずです(X
はISO 8601タイムゾーン用です):
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
うーん、日付形式はXML datetimeデータ型形式のように見えますか? XML日時データ型形式の場合、 javax.xml.datatype.DatatypeFactory を使用してXMLGregorianCalendar
を作成できます。
DatatypeFactory
.newInstance()
.newXMLGregorianCalendar("2012-05-15T07:08:09+03:00");
上記の呼び出しは、XMLGregorianCalendar
のインスタンスを返します。オブジェクトを使用して、他のJava GregorianCalendar
のようなdatetimeオブジェクトに変換できます。
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;
}
いいえ、文字列を前処理せずに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();
最善の方法は、Jodaの
org.joda.time.format.ISODateTimeFormat
よろしく、
次のようなものを試すことができます:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
Date date = df.parse(stringDate.replaceAll("\\+", "GMT+"));
これがあなたのために働くかどうか、私にはよくわかりません。しかし、ここでは、あるタイムゾーンから別のタイムゾーンに日付を変換するときに試したコードを示します。コードの一部が役立つ場合があります。
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;
}
これがお役に立てば幸いです。乾杯。 :)