Шаблон 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));