Шаблон Java SimpleDateFormat для дат W3C XML с часовым поясом

Я пытаюсь проанализировать дату XML-схемы W3C, как показано ниже

"2012-05-15T07:08:09+03:00"

которая соответствует версии ISO 8601 спецификации dateTime XML-схемы W3C.

В вышеуказанную дату идентификатор часового пояса "+03:00", но нет SimpleDateFormat шаблон, по-видимому, существует, чтобы представить его.

Если бы часовой пояс был "+0300", затем Z (заглавными буквами) будет применяться и SimpleDateFormat шаблон будет

yyyy-MM-dd'T'HH:mm:ssZ

Точно так же, если бы часовой пояс "GMT+03:00", затем z (строчные буквы) будет применяться и SimpleDateFormat шаблон будет

yyyy-MM-dd'T'HH:mm:ssz

(верхний регистр 'Z' тоже работает, кстати).

Итак, есть ли SimpleDateFormat шаблон или обходной путь для представления вышеуказанной даты без предварительной обработки строки даты?

9 ответов

Решение

Как насчет чего-то вроде:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"){ 
    public Date parse(String source,ParsePosition pos) {    
        return super.parse(source.replaceFirst(":(?=[0-9]{2}$)",""),pos);
    }
};

Если вы используете Java 7+, этот шаблон должен работать (X для часового пояса ISO 8601):

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");

Хммм, формат даты выглядит как формат даты и времени в формате XML? Если это формат даты и времени в формате XML, вы можете использовать javax.xml.datatype.DatatypeFactory для создания XMLGregorianCalendar

DatatypeFactory
  .newInstance()
  .newXMLGregorianCalendar("2012-05-15T07:08:09+03:00");

Вышеуказанный вызов возвращает экземпляр XMLGregorianCalendar Вы можете использовать объект для преобразования в другие объекты даты и времени Java, такие как GregorianCalendar,

Используйте Apache Commons DateUtils с возможными шаблонами. Пример:

private static final String[] DATE_FORMATS = new String[] {
            "yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ssz",
            "yyyy-MM-dd'T'HH:mm:ssZ", "yyyy-MM-ddz", "yyyy-MM-ddZ" };


    public Date parse(String date) {

        Date parsedDate = null;
        try {
            parsedDate = DateUtils.parseDate(date, DATE_FORMATS);
        } catch (ParseException e) {
            logger.error("dates should be in valid format" + e);
            return null;
        }
               return parsedDate;
              }

Лучший способ - использовать Joda's.

org.joda.time.format.ISODateTimeFormat

С Уважением,

Нет, обходного пути нет SimpleDateFormat понять этот формат без предварительной обработки строки (например, удалив : из строки). (отредактируйте: за исключением того, что вы используете Java 7 или новее, как отмечено в assylias).

Похоже, вы пытаетесь проанализировать строки в стандартном формате XML для даты и времени (ISO 8601). Я бы порекомендовал использовать библиотеку Joda Time, которая поддерживает этот формат.

Если вы не можете или не хотите использовать Joda Time по какой-то причине, то вы можете использовать классы из пакета javax.xml.datatype анализировать и форматировать метки времени в этом формате. Например:

DatatypeFactory factory = DatatypeFactory.newInstance();

// Parses a string in ISO 8601 format to an XMLGregorianCalendar
XMLGregorianCalendar xmlCal = factory.newXMLGregorianCalendar("2012-05-16T10:39:00+03:00");

// Convert it to a regular java.util.Calendar
Calendar cal = xmlCal.toGregorianCalendar();

Вы можете попробовать что-то вроде:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
Date date = df.parse(stringDate.replaceAll("\\+", "GMT+"));

Я не совсем уверен, будет ли это работать для вас или нет. Но вот код, который я пробовал при преобразовании даты из одного часового пояса в другой часовой пояс. Может какая-то часть кода может помочь вам.

public Date convertToUserTimezone(long dateToConvert, String timezoneOffset){
        java.text.DateFormat format = SimpleDateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);/*new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");*/
        // java.util.Calendar cal = Calendar.getInstance(new
        // SimpleTimeZone(0, "GMT+05:30"));
        TimeZone gmtTime = TimeZone.getTimeZone("GMT"+timezoneOffset);


        format.setTimeZone(gmtTime);
        java.util.Date date1 = new Date(format.format(new Date(dateToConvert)));

        return date1;
    }

Надеюсь, это поможет вам. Приветствия.:)

Что касается SimpleDateFormat, вы уже упомянули доступные шаблоны форматов, и они определены в: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

Если вы хотите сделать больше с вашей датой, то GregorianCalendar дает вам больше возможностей, например:

TimeZone zone = TimeZone.getTimeZone(TimeZone.getTimeZone("GMT-8").getID());
GregorianCalendar calendar = new GregorianCalendar(zone);
calendar.setTime(new Date(SomeDate));
Другие вопросы по тегам