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

Nic*_*tti 16 java alfresco date-parsing

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

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

但它引发了一个例外.(例外是(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);
        }
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

JMe*_*nik 22

基本上你的问题是你使用的是SimpleDateFormat(String pattern)构造函数,其中javadoc说:

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

如果您尝试使用此代码:

DateFormat osLocalizedDateFormat = new SimpleDateFormat("MMMM EEEE");
System.out.println(osLocalizedDateFormat.format(new Date()))
Run Code Online (Sandbox Code Playgroud)

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

解决您的问题的方法是使用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()));
Run Code Online (Sandbox Code Playgroud)


Gag*_*arr 6

根据您的评论,我认为您的财产实际上是d:dated:datetime类型.如果是这样,该属性将已作为Java Date对象从Alfresco返回.所以,你需要做的就是:

  NodeRef risposta = childAssocRef.getChildRef();
  Date dataRisposta = (Date)nodeService.getProperty(risposta, AlfrescoConstants.QN_DATA_RISPOSTA);
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 6

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  ) 
)
Run Code Online (Sandbox Code Playgroud)

2011-07-13T00:00+02:00[欧洲/巴黎]

坏数据:WedvsTue

您输入的字符串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`.
Run Code Online (Sandbox Code Playgroud)

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

时间

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

定义格式模式以匹配您的输入字符串。注意Locale,它定义了用于解析月份名称和星期几名称的人类语言。

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

zdt.toString(): 2011-07-13T00:00+02:00[欧洲/巴黎]

时区

CEST是伪时区,而不是真正的时区。永远不要使用这些。它们不是标准化的,甚至不是唯一的(!)。

ZonedDateTime班将勇敢地在猜测这样的性格3-4伪区背后的意图。你CEST碰巧在这里工作,解释Europe/Paris为时区。但是你不能相信猜测是 100% 成功的。相反,完全避免这种伪区域

以、、 或等格式指定正确的时区名称continent/regionAmerica/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.
Run Code Online (Sandbox Code Playgroud)

ISO 8601

您输入字符串的格式很糟糕。将日期时间值序列化为文本时,仅使用标准ISO 8601格式。

所述ZonedDateTime类明智地通过附加在方括号中的时区的名称如在上述实施例中看到的延伸的标准格式。


关于 java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

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

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

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多