Till senaste kommentaren
Detta inlägg är gammalt och kan innehålla inaktuell information.

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

Kommentarer

  • Nu jobbar jag inte på SL, men gissar på att de använder sig av ISO 8601 Durations, se https://en.wikipedia.org/wiki/ISO_8601#Durations

    Då tolkar man PT4M som 4 månader.

    mvh
    /Martin

    PS Som du ser i specen är P duration designator och T time designator
    Team Trafiklab
  • Hej,

    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
  • Hej,

    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

Kommentera eller skriv ett nytt inlägg

Ditt namn och inlägg kan ses av alla. Din e-post visas aldrig publikt.