Как преобразовать дату в этом формате (вт 13 июля 00:00:00 CEST 2010) в дату Java (строка получена из свойства alfresco) - PullRequest
15 голосов
/ 09 мая 2011

Я управляю датой, которая поступает из Alfresco Properties и находится в указанной (вторник, 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);

Но выдается исключение. (Исключением является (SSollevata un'eccezione durante la gestione della data: java.text.ParseException: дата не разборчива: «вт 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);
        }

Кто-нибудь может помочь?

Ответы [ 4 ]

22 голосов
/ 09 мая 2011

В основном ваша проблема - в том, что вы используете SimpleDateFormat (шаблон String) , где javadoc говорит:

Создает SimpleDateFormat, используя данный шаблон и дата по умолчанию символы формата для локали по умолчанию .

И если вы попробуете использовать этот код:

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

вы заметите, что он печатает заголовки месяца и дня недели в зависимости от вашей локали.

Решение вашей проблемы - для переопределения локали даты по умолчанию с использованием SimpleDateFormat (шаблон строки, локаль локали) конструктор:

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()));
6 голосов
/ 09 мая 2011

Исходя из ваших комментариев, я считаю, что ваша собственность на самом деле имеет тип d: дата или d: дата-время . Если это так, свойство уже будет возвращаться из Alfresco как объект Java даты. Итак, все, что вам нужно сделать, это:

  NodeRef risposta = childAssocRef.getChildRef();
  Date dataRisposta = (Date)nodeService.getProperty(risposta, AlfrescoConstants.QN_DATA_RISPOSTA);
3 голосов
/ 14 января 2018

ТЛ; др

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 против Tue

Вы ввели строку Tue Jul 13 00:00:00 CEST 2011 неверно. 13 июля 2011 года была среда, , а не вторник .

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.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , в настоящее время находящийся в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Где получить классы java.time?

  • Java SE 8 , Java SE 9 и выше
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 и 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализаций комплекта Android классов java.time (JSR 310).
    • Для более ранних версий Android проект ThreeTenABP адаптируется ThreeTen-Backport (упоминалось выше). См. Как использовать ThreeTenABP… .

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

1 голос
/ 09 мая 2011

Проблема в том, что CEST не является часовым поясом, поддерживаемым Java. Вы можете использовать «CST».

Примечания Javadoc для TimeZone:

Трехбуквенные идентификаторы часовых поясов Для совместимости с JDK 1.1.x также поддерживаются некоторые другие трехбуквенные идентификаторы часовых поясов (такие как «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
...
...