web-dev-qa-db-ja.com

この形式の日付(Tue Jul 13 00:00:00 CEST 2010)をJava Date(文字列はalfrescoプロパティから取得)に変換する方法

私は、Alfrescoプロパティから取得され、指定された日付(火7月13日00:00:00 CEST 2010)にある日付を管理しています。これをJava ..日付に変換する必要があります。 .i周りを見回して、さまざまな文字列から日付への変換フォームと このページ の何百万もの投稿を見つけたので、次のようなことを試しました:

private static final DateFormat alfrescoDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
Date dataRispostaDate = alfrescoDateFormat.parse(dataRisposta);

ただし、例外がスローされます(例外は(SSollevata un'eccezione durante la gestione della data:Java.text.ParseException:Unparseable date: "Tue Jul 13 00:00:00 CEST 2011")。

私は完全なコードを投稿します:

        try {
            QName currDocTypeQName = (QName) nodeService.getType(doc);
            log.error("QName:["+currDocTypeQName.toString()+"]");
            if (currDocTypeQName != null) {
                String codAtto = AlfrescoConstants.getCodAttoFromQName(currDocTypeQName.toString());
                log.error("codAtto:["+codAtto+"]");
                if (codAtto.equals(AlfrescoConstants.COD_IQT)){
                    List<ChildAssociationRef> risposteAssociate = nodeService.getChildAssocs(doc, AlfrescoConstants.QN_RISPOSTEASSOCIATE, RegexQNamePattern.MATCH_ALL);
                    for (ChildAssociationRef childAssocRef : risposteAssociate) {
                        // Vado a prendere il nodo
                        NodeRef risposta = childAssocRef.getChildRef();
                        String dataRisposta = (nodeService.getProperty(risposta, AlfrescoConstants.QN_DATA_RISPOSTA)).toString();
                        log.error("dataRisposta:["+dataRisposta+"]");
                        if (!dataRisposta.isEmpty()){
                            try {
                                Date dataDa = dmyFormat.parse(req.getParameter("dataDa"));
                                log.error("dataDa:["+dataDa.toString()+"]");
                                Date dataA = dmyFormat.parse(req.getParameter("dataA"));
                                log.error("dataA:["+dataA.toString()+"]");
                                Date dataRispostaDate = alfrescoDateFormat.parse(dataRisposta);
                                log.error("dataRispostaDate:["+dataRispostaDate.toString()+"]");

                                if (dataRispostaDate.after(dataDa) && dataRispostaDate.before(dataA)){
                                    results.add(doc);
                                    log.error("La data risposta  è compresa tra le date specificate");
                                }else{
                                    log.error("La data risposta non è compresa tra le date specificate");
                                }
                            } catch (ParseException e) {
                                log.error("Sollevata un'eccezione durante la gestione della data: " + e);
                                throw new RuntimeException("Formato data non valido");
                            }
                        }else{
                            log.error("La data risposta non è specificata");
                        }
                    }
                }else{
                    results.add(doc);
                }
            }
        } catch (Exception e) {
            log.error("Sollevata un'eccezione durante la gestione del codice atto nel webscript nicola: " + e);
        }

誰でも手伝ってくれる?

17

基本的に、あなたの問題はSimpleDateFormat(String pattern) コンストラクタを使用していることで、javadocは次のように述べています:

指定されたパターンとデフォルトロケールのデフォルトの日付フォーマット記号を使用してSimpleDateFormatを構築します。

そして、あなたがこのコードを使用しようとすると:

DateFormat osLocalizedDateFormat = new SimpleDateFormat("MMMM EEEE");
System.out.println(osLocalizedDateFormat.format(new Date()))

ロケールに基づいて月と曜日のタイトルを出力することに気づくでしょう。

問題の解決策はSimpleDateFormat(String pattern、Locale locale) コンストラクタを使用してデフォルトの日付ロケールを上書きすることです:

DateFormat dateFormat = new SimpleDateFormat(
            "EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
dateFormat.parse("Tue Jul 13 00:00:00 CEST 2011");
System.out.println(dateFormat.format(new Date()));
23
JMelnik

あなたのコメントに基づいて、あなたのプロパティは実際にはタイプd:dateまたはd:datetimeであると思います。その場合、プロパティはすでにJava DateオブジェクトとしてAlfrescoから返されます。したがって、必要なことは次のとおりです。

  NodeRef risposta = childAssocRef.getChildRef();
  Date dataRisposta = (Date)nodeService.getProperty(risposta, AlfrescoConstants.QN_DATA_RISPOSTA);
6
Gagravarr

tl; dr

ZonedDateTime.parse(                     // Produce a `Java.time.ZonedDateTime` object.
    "Wed Jul 13 00:00:00 CEST 2011" ,    // Corrected `Tue` to `Wed`.
    DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss zzz uuuu" , Locale.US  ) 
)

2011-07-13T00:00 + 02:00 [ヨーロッパ/パリ]

悪いデータ:Wed vs Tue

入力した文字列Tue Jul 13 00:00:00 CEST 2011は無効です。 2011年7月13日は水曜日であり、火曜日ではありませんでした。

String input = "Wed Jul 13 00:00:00 CEST 2011" ;  // Corrected `Tue` to `Wed`.

screen shot of July 2011 calendar in Duck Duck Go search engine

Java.time

最新のアプローチでは、他のアンサーに見られる厄介な古いレガシー日時クラスではなく、Java.timeクラスを使用します。

入力文字列と一致するフォーマットパターンを定義します。 Locale は、月の名前と曜日の名前の解析に使用される人間の言語を定義していることに注意してください。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss zzz uuuu" , Locale.US  );
ZonedDateTime zdt = ZonedDateTime.parse( input , f  );

zdt.toString():2011-07-13T00:00 + 02:00 [ヨーロッパ/パリ]

タイムゾーン

CEST は、実際のタイムゾーンではなく、疑似ゾーンです。これらは絶対に使用しないでください。それらは標準化されておらず、一意でもありません(!)。

ZonedDateTimeクラスは、このような3〜4文字の疑似ゾーンの背後にある意図を推測するために勇敢な努力をします。あなたのCESTはたまたまここで機能し、 Europe/Paris タイムゾーンとして解釈されます。しかし、100%成功しているという推測に頼ることはできません。代わりに、そのような疑似ゾーンを完全に避けます

適切なタイムゾーン名continent/regionの形式で指定します(例: America/Montreal 、- Africa/Casablanca 、またはPacific/Auckland

ZoneId z = ZoneId.of( "Europe/Paris" );  // https://time.is/Paris
LocalDate today = LocalDate.now( z );  // Current date varies around the globe by zone.

ISO 8601

入力文字列の形式がひどいです。日時値をテキストとしてシリアル化する場合は、標準の ISO 8601 形式のみを使用してください。

ZonedDateTimeクラスは、上記の例に示すように、角かっこでタイムゾーンの名前を追加することにより、標準形式を賢く拡張しています。


Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い レガシー のような日時クラスに取って代わります- Java.util.DateCalendar 、& SimpleDateFormat

Joda-Time プロジェクトは maintenance mode になり、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracleチュートリアル を参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 31 です。

Java.timeクラスはどこで入手できますか?

  • Java SE 8 Java SE 9 以降
    • ビルトイン。
    • 標準の一部Java APIがバンドルされた実装。
    • Java 9では、いくつかのマイナーな機能と修正が追加されています。
  • Java SE 6 および Java SE 7
  • Android
    • 以降のバージョンのAndroidには、Java.time(JSR 310)クラスの実装がバンドルされています。
    • 以前のAndroidの場合、 ThreeTenABP プロジェクトはThreeTen-Backport (上記の通り)。 ThreeTenABPの使用方法… を参照してください。

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明する場です。 IntervalYearWeekYearQuarter のようないくつかの便利なクラスがここにあります。 、および more

4
Basil Bourque

問題は、CESTがタイムゾーンではないことですJavaがサポートしています。「CST」を使用できます。

TimeZoneのJavadocによると、

3文字のタイムゾーンID JDK 1.1.xとの互換性のために、他のいくつかの3文字のタイムゾーンID(「PST」、「CTT」、「AST」など)もサポートされています。ただし、これらの使用は非推奨です。これは、同じ略語が複数のタイムゾーンでよく使用されるためです(たとえば、「CST」は米国の「中央標準時」になる可能性があります)。および「中国標準時」)、およびJavaプラットフォームは、そのうちの1つしか認識できません。

3/4文字のタイムゾーンのサポートについては、JodaTimeを試してみることをお勧めします。


String dataRisposta = "Tue Jul 13 00:00:00 CST 2010";
Date dataRispostaDate = alfrescoDateFormat.parse(dataRisposta);
System.out.println(dataRispostaDate);

プリント

Tue Jul 13 07:00:00 BST 2010

String[] ids = TimeZone.getAvailableIDs();
Arrays.sort(ids);
for (String id : ids) {
    System.out.println(id);
}

プリント

...
CAT
CET
CNT
CST
CST6CDT
CTT
...
1
Peter Lawrey