Подтвердить что ты не робот

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

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

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

который соответствует спецификации ISO 8601 спецификации W3C XML Schema dateTime.

В вышеприведенную дату идентификатор часового пояса "+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 или обходной путь для представления указанной даты без предварительной обработки строки даты?

4b9b3361

Ответ 1

Как насчет чего-то типа:

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

Нет, нет обходного пути, чтобы 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();

Ответ 5

использовать 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;
              }

Ответ 6

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

org.joda.time.format.ISODateTimeFormat

Привет,

Ответ 7

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

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

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

Ответ 8

Что касается 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));

Ответ 9

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

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