Reseplanerare 3: Hur ska duration värdet tolkas
Hur ska duration värdet tolkas som finns under Leg?
Exempel:
"duration": "PT4M",
4 minuter? Vad betyder PT?
"Leg": [
{
"Origin": {
....
},
"Destination": {
...
},
"idx": "0",
"name": "",
"type": "WALK",
"duration": "PT4M",
"dist": 237
},
/Anders
Exempel:
"duration": "PT4M",
4 minuter? Vad betyder PT?
"Leg": [
{
"Origin": {
....
},
"Destination": {
...
},
"idx": "0",
"name": "",
"type": "WALK",
"duration": "PT4M",
"dist": 237
},
/Anders
Följ inlägget
0
följare
Då tolkar man PT4M som 4 månader.
mvh
/Martin
PS Som du ser i specen är P duration designator och T time designator
Duration motsvarar durations i ovan nämnda standard, med skillnaden att det initiala P:et kan ersättas av ett R om det kommer från realtidsdata. PT4M är då inte fyra månader utan 4 minuter.
Efter P eller R,
##DT##H##M
Där det som ev är 0 helt utesluts.Dvs som exemplet ovan så är vare sig dag eller timmar med.
År/månad och sekunder kommer inte ut från systemet
Ex.
P1DT1H22M = Planerat 1 dag 1 timme och 22 minuter
PT1H2M = Planerat 1 timme och 2 minter
PT15M = Planerat 15 minuter.
Mvh,
/Martin
Varför typar ni då (i XML-schemat) en duration som en "xs:duration" vilket den inte är?
(det hjälper inte att strängen nästan följer standarden när den inte följer standarden fullt ut)
Den där "skillnaden att det initiala P:et kan ersättas av ett R" (citat från inlägget ovan) innebär att det faktiskt inte är en "xs:duration" vilket XML-schemat felaktigt hävdar.
Typningen innebär problem med XML-bibliotek som förutsätter duration-strängar enligt standarden och som självklart inte känner till SL's avvikelse.
Beroende på vilket bibliotek kan använder kan det resultera i null eller kastas ett exception.
Om man t.ex. använder Java med JAXB så får man ett exception ungefär så här om en duration sträng är "RT3M" istället för "PT3M":
Exception in thread "main" java.lang.IllegalArgumentException: RT3M
at java.xml/com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl.<init>(DurationImpl.java:470)
Om det istället hade varit en sträng ("xs:string") skulle JAXB fungera automatiskt, och när man då skulle få tillgång till en duration string skulle man kunna kolla om det första tecknet är "R" och i så fall ersätta det med "P" och sedan använda följande:
Duration duration = javax.xml.datatype.DatatypeFactory.newInstance().newDuration(durationAsString); // t.ex. "PT3M" istället för "RT3M"
och om man ersatte första bokstaven (R -> P) kan man hålla reda på det med en egen boolean variabel att det gäller realtidsdata.
Ännu bättre (istället för att ändra typen till xs:string och dokumentera att ni nästan följer standarden) vore dock att verkligen följa standarden för "xs:duration" och att istället lägga till ett särskilt attribut i XML-schemat som specificerar att det gäller realtidsdata.
/ Tomas