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

时间:2011-05-09 12:42:15

标签: java alfresco date-parsing

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

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);
        }

任何人都可以提供帮助吗?

5 个答案:

答案 0 :(得分:21)

基本上你的问题你正在使用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()));

答案 1 :(得分:6)

根据您的评论,我认为您的媒体资源实际上属于 d:date d:datetime 。如果是这样,该属性将已作为Java Date对象从Alfresco返回。所以,你需要做的就是:

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

答案 2 :(得分:2)

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

错误数据: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类,而不是其他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 的格式指定proper time zone name,例如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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

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

答案 3 :(得分:1)

问题是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
...

答案 4 :(得分:0)

尝试使用此功能,我遇到了同样的问题。

public String getMyDate(String myDate, String requiredFormat, String mycurrentFormat) {
    DateFormat dateFormat = new SimpleDateFormat(returnFormat);
    Date date = null;
    String returnValue = "";
    try {
        date = new SimpleDateFormat(myFormat, Locale.ENGLISH).parse(myDate);
        returnValue = dateFormat.format(date);
    } catch (ParseException e) {
        returnValue = myDate;
    }
    return returnValue;
}

示例:

2020年5月6日星期三13:01:29即“ EEE MMM dd HH:mm:ss zzz yyyy”是mycurrentFormat

2020年5月4日,即“ d.MMM.yyyy”是我的requiredFormat

Date date = new Date();

getMyDate(date.toString(), "d.MMM.yyyy", "EEE MMM dd HH:mm:ss zzz yyyy")