2011-12-13 7 views
1

Я пытаюсь использовать Joda для поддержки всех времен XACML-данных, но у меня возникают проблемы с его синтаксическим разбором, начиная с строк, таких как «P50DT4H4M3S». Я подозреваю, что проблема в некоторых случаях разделена на ISO и W3C, и Joda поддерживает путь ISO.JodaTime для XML Schema/XACML Типы длительности

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

Я знаю типы javax.xml, которые, кажется, делают то, что мне нужно, за исключением его основанного на GregorianCalendar, которого я надеялся избежать, используя Joda.

+0

Длительности независимы от календарей. Разбирайте строку продолжительности в линейное время (секунды, мс, что угодно). Затем вы сможете использовать это в арифметике даты с любой системой класса даты/календаря, которую вы хотите. – dthorpe

+0

FWIW, продолжительность W3C поддерживается SOAP. Посмотрите, можете ли вы найти SOAP lib для Java и использовать одну из своих функций для синтаксического анализа строки продолжительности. В .NET я использую System.Runtime.Remoting.Metadata.W3cXsd2001.SoapDuration – dthorpe

+0

Существует множество пакетов, которые анализируют нужные мне форматы; javax.xml. *, чтобы назвать один. Проблема в том, что они не взаимодействуют с Joda DateTime и многими другими, которые я использую в другом месте, поэтому мне действительно нужно заставить Duration работать. – Bradjcox

ответ

3

P50DT4H4M3S - это Period в терминологии Joda-Time и может быть проанализирован с использованием PeriodFormatter. Существуют стандартные парсеры в ISOPeriodFormat.

+1

FYI: Тест соответствия XACML 2.0 IIC003 имеет один тест с YearMonthDuration из «-P1Y2M», который не обрабатывает парсер Joda Period. Не знаю, что неправильно; Просто думал, что вы должны знать. Я взломал его сейчас в компиляторе Xacml3.0. – Bradjcox

+0

FWIW этот вопрос возник из-за того, что XACML использует Duration для обозначения того, что JodaTime вызывает Period при предоставлении чего-то совершенно другого с именем Duration. Разве стандарты не замечательные? ;) – Bradjcox

0

Что-то вроде этого:

PeriodFormatter formatter = ISOPeriodFormat.standard(); 
Period period = asd.parsePeriod(periodString); 
Duration duration = dsa.toStandardDuration();