13

次のように日付を解析するコードがありました。

String ALT_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
SimpleDateFormat sdf = new SimpleDateFormat(
                    ALT_DATE_TIME_FORMAT);
Date date = sdf.parse(requiredTimeStamp);

そして、それはうまく機能していました、突然、これは機能しなくなりました。管理者がサーバーでいくつかの構成変更を行ったことが判明し、日付は現在「2010-12-27T10:50:44.000-08:00」として返されていますが、これは上記のパターンでは解析できません。2つの質問があります:

1つ目は、JVMによって上記の形式で返される日付(具体的には、タイムゾーンとして「-08:00」のみ)を解析するパターンはどれですか。そして第二に、Linux RHEL 5サーバーでそのような設定を正確にどこで変更して、将来そのような変更を認識できるようにするのでしょうか。

4

9 に答える 9

27
于 2016-09-05T21:27:14.843 に答える
4

もう1つのアプリケーションは、ISO8601dateTime形式を使用しています。他のアプリケーションが、XMLスキーマのdateTime型(ISO 8601)に準拠したXML応答を送信していると想定しています。現在、DateFormatがこの形式を解析できないことは既知のことです。joda-time(joda-timeが勝者)または他の応答で指定されているFastDateFormatなどの他のライブラリを使用する必要があります。この投稿を見てくださいISO8601準拠の文字列をjava.util.Dateに変換する

于 2010-12-28T01:01:54.463 に答える
2

それでも答えを探しているなら、これは私のために働いた

私の入力:2020-12-08T10:36:53.939 + 05:30
私の出力:火12月8日10:36:53 IST 2020

この日付は必要な形式に変換できます。

private static Date convertDate(String input) {
    Date newDate = null;
    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
        newDate=dateFormat.parse(input);  
    } catch (Exception e) {
        e.printStackTrace();
    }
    return newDate;
}
于 2020-12-08T12:50:10.130 に答える
1

ストレートJDKを使用して解析する場合は、JAXButilsを使用して解析可能である必要があると思います。DatatypeFactory.newXMLGregorianCalendarまたはDatatypeConverter.parseDateTime参照してください。

于 2010-12-28T01:04:34.947 に答える
1

JodaTimeを使用する

JodaTimeを使用するという@Pangeaの提案のより具体的な例として、これを使用できます。

String timestamp = "2012-09-17T04:11:46Z";

DateTime date = ISODateTimeFormat.dateTimeParser().parseDateTime(timestamp);

これにより、UTCタイムゾーンが正しく認識されます。文字列のタイムスタンプにミリ秒を使用したことはありませんが、同様に機能すると確信しています。

それが他の人を助けることを願っています。

JP

于 2013-12-10T01:17:55.213 に答える
0

問題は、どこrequiredTimeStampから来て、どの形式であるかということです。ユーザーが入力したものですか、それとも別のプログラムから読み取ったものですか?文字列表現で日付を作成するコンポーネントはどれですか?

「2010-12-27T10:50:44.000-08:00」の形式は、標準化された形式ISO-8601のように見えます 。パターンで解析可能である必要があります。yyyy-MM-dd'T'HH:mm:ss.SSSZ

どの設定がこれに影響するかはわかりませんが、JavaTimeZonesに関するOracleFAQがあります。これは、user.timezoneシステムプロパティまたは/etc/localtimeRHELのシンボリックリンクである可能性があります。

于 2010-12-28T00:09:20.690 に答える
0

小文字のzに変更してみてください。

zは、一般的な一般的なタイムゾーン構文のほとんどを処理しますが、Zは4桁のより厳密なRFC822タイムゾーンを使用します。

両方とも「一般的なタイムゾーン設定」を解析する必要があることが文書化されていますが、場合によっては違いが生じる可能性があります。

于 2010-12-28T00:51:16.783 に答える
0

-0800SimpleDateFormatは、またはGMT-08:00タイムゾーンとしてのみ受け入れます。

ISO8601形式はで解析できないようSimpleDateFormatです。たぶん、ApacheCommonsLangFastDateFormatを見てください。互換性がありますが、必要なタイムゾーン形式を解析する必要があるタイムゾーンSimpleDateFormatのパターンを受け入れます。DateFormatUtilsには、ミリ秒がないだけで、必要なパターンのように見える定数の例がいくつか含まれています(たとえば、ISO_DATETIME_TIME_ZONE_FORMAT)。ZZ

于 2010-12-28T00:53:44.447 に答える
0

2つの解決策:

  • OffsetDateTime(Java 8に組み込まれています)
  • joda(すべての強力な日付-サードパーティのライブラリ)

ここでは、OffsetDateTimeの方が明らかに優れたオプションですが、jodaがかなり前から非常に強力であることが証明されており、誰かがそれを使用することを好む場合は、以下のコードに両方のサンプルがあります。

両方のアプローチのコードサンプルを以下に示します。

public class Demo {
public static void jodaTimeStuff(String dateString, DateTimeZone dtz) {
    System.out.println(StringUtils.leftPad(dateString, 29, " ") + "\t------->\t" + ISODateTimeFormat.dateTime().parseDateTime(dateString).toDateTime(dtz));
    System.out.println(StringUtils.leftPad(dateString, 29, " ") + "\t------->\t" + OffsetDateTime.parse(dateString).toZonedDateTime());
}
public static void main(String[] args) throws Exception {
    jodaTimeStuff("2010-03-01T08:00:00.000Z", DateTimeZone.UTC);
    jodaTimeStuff("2010-03-01T08:00:00.000Z", DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Kolkata")));
    jodaTimeStuff("2010-03-01T00:00:00.000-08:00", DateTimeZone.UTC);
    jodaTimeStuff("2010-03-01T00:00:00.000-08:00", DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Kolkata")));
    jodaTimeStuff("2010-03-01T00:00:00.000+05:30", DateTimeZone.UTC);
    jodaTimeStuff("2010-03-01T00:00:00.000+05:30", DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Kolkata")));
    jodaTimeStuff("2021-11-15T02:27:24.540288Z", DateTimeZone.UTC);
    jodaTimeStuff("2021-11-15T02:27:24.540288Z", DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Kolkata")));
}

}

出力:

     2010-03-01T08:00:00.000Z   ------->    2010-03-01T08:00:00.000Z
     2010-03-01T08:00:00.000Z   ------->    2010-03-01T08:00Z
     2010-03-01T08:00:00.000Z   ------->    2010-03-01T13:30:00.000+05:30
     2010-03-01T08:00:00.000Z   ------->    2010-03-01T08:00Z
2010-03-01T00:00:00.000-08:00   ------->    2010-03-01T08:00:00.000Z
2010-03-01T00:00:00.000-08:00   ------->    2010-03-01T00:00-08:00
2010-03-01T00:00:00.000-08:00   ------->    2010-03-01T13:30:00.000+05:30
2010-03-01T00:00:00.000-08:00   ------->    2010-03-01T00:00-08:00
2010-03-01T00:00:00.000+05:30   ------->    2010-02-28T18:30:00.000Z
2010-03-01T00:00:00.000+05:30   ------->    2010-03-01T00:00+05:30
2010-03-01T00:00:00.000+05:30   ------->    2010-03-01T00:00:00.000+05:30
2010-03-01T00:00:00.000+05:30   ------->    2010-03-01T00:00+05:30
  2021-11-15T02:27:24.540288Z   ------->    2021-11-15T02:27:24.540Z
  2021-11-15T02:27:24.540288Z   ------->    2021-11-15T02:27:24.540288Z
  2021-11-15T02:27:24.540288Z   ------->    2021-11-15T07:57:24.540+05:30
  2021-11-15T02:27:24.540288Z   ------->    2021-11-15T02:27:24.540288Z

サンプルコードで使用されているいくつかの依存関係(1つはフォーマット用で、もう1つはjoda用です:

    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10.13</version>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.8</version>
    </dependency>

Dua me yaad rakhna(あなたの祈りの中で私を覚えておいてください)

于 2021-12-18T05:38:11.390 に答える