如何将此格式的日期(Tue Jul 13 00:00:00 CEST 2010)转换为Java日期(该字符串来自露天属性)

我正在管理一个来自Alfresco Properties的日期,并且在指定的时间(2010年7月13日00:00:00 CEST 2010),我需要将其转换为Java日期……我环顾四周,找到数百万各种字符串到日期转换表单的post以及此页面 ,所以我试过这样的事情:

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 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模式)构造函数,其中javadoc说:

使用给定模式构造SimpleDateFormat,并使用默认语言环境的默认日期格式符号。

如果您尝试使用此代码:

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

您会注意到它会根据您的区域设置打印您的月份和星期几标题。

解决您的问题的方法是使用SimpleDateFormat(String pattern,Locale locale)构造函数覆盖默认的Date语言环境 :

 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:dated:datetime类型 。 如果是这样,该属性将已作为Java Date对象从Alfresco返回。 所以,你需要做的就是:

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

问题是CEST不是Java支持的时区。 你可以使用“CST”。

TimeZone的Javadoc注意到:

三字母时区ID为了与JDK 1.1.x兼容,还支持其他一些三字母时区ID(例如“PST”,“CTT”,“AST”)。 但是, 它们的使用已被弃用,因为相同的缩写通常用于多个时区(例如,“CST”可能是美国“中央标准时间”和“中国标准时间”),然后Java平台只能识别其中一个他们。

对于三/四字母时区支持,我建议您尝试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 ... 

TL;博士

 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 [欧洲/巴黎]

糟糕的数据: WedTue

您输入字符串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`. 

鸭鸭Go搜索引擎的2011年7月日历的屏幕截图

java.time

现代方法使用java.time类,而不是其他Answers中看到的麻烦的旧遗留日期时间类。

定义格式模式以匹配输入字符串。 请注意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/MontrealAfrica/CasablancaPacific/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.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time(JSR 310)类的实现。
    • 对于早期的Android, ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。