2013-12-23 1 views
3

Я пытаюсь разобрать/проверить дату 2013-06-19T12:00-05:00 с использованием Java 6Обработка часового пояса при обработке даты в Java 6

Я попытался несколько моделей, в том числе следующие:

yyyy-MM-dd'T'HH:mmz 
yyyy-MM-dd'T'HH:mmZ 
yyyy-MM-dd'T'HH:mm'Z' 
yyyy-MM-dd'T'HH:mm Z 
yyyy-MM-dd'T'HH:mm z 
yyyy-MM-dd'T'HH:mm'z' 
yyyy-MM-dd'T'HH:mm-Z 
yyyy-MM-dd'T'HH:mm-z 
yyyy-MM-dd'T'hh:mm:ssZ 
yyyy-mm-DD'T'hh:mm:ssZ 
yyyy-MM-DD'T'hh:mm:ssZ 
yyyy-MM-dd'T'HH:mm:ssZ 
yyyy-MM-dd'T'HH:mm:ssz 

, но получаю ParseException.

Каким будет подходящий формат/шаблон для синтаксического анализа 2013-06-19T12:00-05:00?

Спасибо.

+0

Если вы не знаете, формат представления даты/времени у вас есть, как вы можете ожидать, чтобы разобрать его? Ни один из ваших шаблонов, похоже, не соответствует этому примеру. Как К.К. сказал, что это может быть интервал. –

+0

Пожалуйста, прочтите [это] (http://stackoverflow.com/a/2202300/1237297). – jagmohan

ответ

1

Использование SimpleDateFormat с рисунком, как "YYYY-MM-dd'T'HH-мм: сс: СС"

2
String dateString = "2013-06-19T12:00-05:00"; 
    String pattern = "yyyy-MM-dd'T'HH:mmZ"; 
    DateTimeFormatter dtf = DateTimeFormat.forPattern(pattern); 
    DateTime dateTime = dtf.parseDateTime(dateString); 
    Date ans=dateTime.toDate(); 
    System.out.println(ans); 
+1

Вы пробовали это в реальном коде? – jagmohan

+1

Я считаю, что это доступно только для Java 7. – jagmohan

+0

да, это то же самое в java 6 http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html – Dima

2

Я хотел бы предложить вам использовать прекрасную библиотеку Joda-времени, чтобы сделать это, в частности, parse(String str) метод DateTime класса, который будет анализировать дату пример использования по умолчанию ISODateTimeFormat.dateTimeParser()

JavaDoc для DateTime.parse(String str) находится в http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#parse%28java.lang.String%29 и вы можете прочитать больше о Joda-времени на http://www.joda.org/joda-time/

+0

Использование 'Joda-Time' похоже избыток. В «Java 6» проблему можно решить, просто добавив «часовой пояс». Пожалуйста, посмотрите мой ответ, используя 'regex', чтобы сделать это. –

+0

Joda-Time предоставляет ** намного более удобный API для использования, чем стандартный API-интерфейс даты и времени Java 6, поэтому я всегда буду использовать его, предпочитая стандартный API. Joda-Time также имеет дополнительные преимущества, такие как возможность контролировать то, что такое «текущее» время, что очень полезно для модульного тестирования кода, чувствительного к времени. – azordi

0

Библиотека Joda-Time 2.3 уже построена для обработки этого формата ISO 8601. Не нужно создавать formatter.

Я произвольно выбрал Montréal Québec в качестве часового пояса из-за вашего смещения часового пояса -05: 00. Возможно, вам лучше работать с датами UTC/GMT, и в этом случае вы можете передать предварительно определенный экземпляр: DateTimeZone.UTC.

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so. 
// import org.joda.time.*; 

String dateTimeString = "2013-06-19T12:00-05:00"; 
DateTimeZone timeZone = DateTimeZone.forID("America/Montreal"); // Or for UTC/GMT, use: DateTimeZone.UTC 

DateTime dateTime = new DateTime(dateTimeString, timeZone); 

самосвала утешать ...

System.out.println("dateTimeString: " + dateTimeString); 
System.out.println("dateTime: " + dateTime); 
System.out.println("dateTime in UTC/GMT: " + dateTime.toDateTime(DateTimeZone.UTC)); 

При запуске ...

dateTimeString: 2013-06-19T12:00-05:00 
dateTime: 2013-06-19T13:00:00.000-04:00 
dateTime in UTC/GMT: 2013-06-19T17:00:00.000Z 

Примечание разница в один час, потому что Монреаль Québec был в Daylight Saving Time (DST) на эту дату.

+0

Я нашел использование 'Joda-Time', чтобы быть излишним. В 'Java 6' проблема может быть решена в основном путем добавления' timezone'. Пожалуйста, посмотрите мой ответ, используя 'regex', чтобы добавить' часовой пояс'. –

+0

Я нахожу Joda-Time настолько полезным, что это первая библиотека, которую я добавляю в любой новый проект. –

0

Дата 2013-06-19T12:00-05:00 не может быть проанализирована под Java 6 в текущей форме. С другой стороны, использование Joda-Time кажется излишним.

Для решения проблемы я добавил часовой пояс даты:

public Date extractDate(String dateStr) { 

    Pattern aPattern = Pattern.compile("\\d+([+-]\\d+:\\d+)$", Pattern.DOTALL | Pattern.CASE_INSENSITIVE); 
    Matcher matcher = aPattern.matcher(dateStr); 

    if(matcher.find()){ 
     String timezone = matcher.group(1); 
     System.out.println("timezone:" + timezone); 
     dateStr = StringUtils.replace(dateStr, timezone, "GMT" + timezone); 
    } 

    Date date = null; 
    String [] datePatterns = {"yyyy-MM-dd'T'HH:mmZ"}; 
    try { 
     date = DateUtils.parseDateStrictly(dateStr, datePatterns); 
    } 
    catch (Exception except) {   
     except.printStackTrace();   
    } 
    return date; 
} 
+0

Как вы можете сказать, что однострочный с Joda-Time является излишним, а затем предлагает ручную функцию с более чем дюжиной строк? 'DateUtils.parseDateStrictly()' является частью внешней библиотеки - Apache Commons - почему вы чувствуете, что использование этого не слишком велико, но использование Joda-Time? С помощью Joda-Time вся ваша функция может быть заменена просто «Date date = DateTime.parse (dateStr) .toDate();' – azordi

+0

@azordi apache commons - это библиотека, которую я широко использую. Это не ограничивается обработкой дат. Я не хотел вытаскивать всю стороннюю библиотеку, которая занимается только датой. Я бы сделал это, если бы писал приложение календаря. –