私は、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);
}
誰でも手伝ってくれる?
基本的に、あなたの問題は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()));
あなたのコメントに基づいて、あなたのプロパティは実際にはタイプd:dateまたはd:datetimeであると思います。その場合、プロパティはすでにJava DateオブジェクトとしてAlfrescoから返されます。したがって、必要なことは次のとおりです。
NodeRef risposta = childAssocRef.getChildRef();
Date dataRisposta = (Date)nodeService.getProperty(risposta, AlfrescoConstants.QN_DATA_RISPOSTA);
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`.
最新のアプローチでは、他のアンサーに見られる厄介な古いレガシー日時クラスではなく、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 形式のみを使用してください。
ZonedDateTime
クラスは、上記の例に示すように、角かっこでタイムゾーンの名前を追加することにより、標準形式を賢く拡張しています。
Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い レガシー のような日時クラスに取って代わります- Java.util.Date
、 Calendar
、& SimpleDateFormat
。
Joda-Time プロジェクトは maintenance mode になり、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracleチュートリアル を参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 31 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明する場です。 Interval
、 YearWeek
、 YearQuarter
のようないくつかの便利なクラスがここにあります。 、および more 。
問題は、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
...