3

Java では、パターンで SimpleDateFormat を使用する場合:

yyyy-MM-dd'T'HH:mm:ss.SSSZ

日付は次のように出力されます。

"2002-02-01T18:18:42.703-0700"

xquery で xs:dateTime 関数を使用すると、次のエラーが発生します。

"Invalid lexical value [err:FORG0001]"

上記の日付で。xquery が適切に解析するには、日付が次のようになっている必要があります。

"2002-02-01T18:18:42.703-07:00" - node the ':' 3rd position from end of string

これは ISO 8601 に基づいていますが、Java 日付は RFC 822 標準に基づいています。

xqueryが望む方法で出力されるように、Javaでタイムゾーンを簡単に指定できるようにしたいと思います。

ありがとう!

4

4 に答える 4

4

OK、フォーラム投稿DIDヘルプにリンクされています。ありがとうございます。しかし、私は以下に含めるより簡単な解決策を見つけました:

1)Apache commons.lang javaライブラリ
を使用します。2)次のJavaコードを使用します。

//NOTE: ZZ on end is not compatible with jdk, but allows for formatting  
//dates like so (note the : 3rd from last spot, which is iso8601 standard):  
//date=2008-10-03T10:29:40.046-04:00  
private static final String DATE_FORMAT_8601 = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ";  
DateFormatUtils.format(new Date(), DATE_FORMAT_8601)  
于 2008-10-03T14:37:28.540 に答える
1

さて、私は問題に遭遇しました-DateUtils(apache commons langから)が作成するISO文字列から変換して日付に戻す方法があったとは思えません(そして私は間違っている可能性があります)!
すなわち。apache commons は希望どおりにフォーマットしますが、再度日付に変換することはありません

そこで、JodaTime に切り替えました。これは ISO8601 に基づいているため、はるかに簡単です。コードは次のとおりです。

public static void main(String[] args) {
    Date date = new Date();  
    DateTime dateTime = new DateTime(date);  
    DateTimeFormatter fmt = ISODateTimeFormat.dateTime();  
    String dateString = fmt.print(dateTime);  
    System.out.println("dateString=" + dateString);  
    DateTime dt = fmt.parseDateTime(dateString);  
    System.out.println("converted date=" + dt.toDate());  
} 
于 2008-10-10T15:27:10.280 に答える
1

commons.lang.java に関する素晴らしい発見! 次のようにすることで、独自のフォーマット文字列を作成する手間を省くことができます。

DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date());
于 2009-06-29T20:15:46.873 に答える
0

これを試して:

static public String formatISO8601(Calendar cal) {
MessageFormat format = new MessageFormat("{0,time}{1,number,+00;-00}:{2,number,00}");

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
df.setTimeZone(cal.getTimeZone());
format.setFormat(0, df);

long zoneOff = cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET) / 60000L;
int zoneHrs = (int) (zoneOff / 60L);
int zoneMins = (int) (zoneOff % 60L);
if (zoneMins < 0)
    zoneMins = -zoneMins;

return (format.format(new Object[] { cal.getTime(), new Integer(zoneHrs), new Integer(zoneMins) }));
}
于 2008-10-03T13:03:56.250 に答える