You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@daffodil.apache.org by "Costello, Roger L." <co...@mitre.org> on 2019/10/01 12:38:10 UTC

How to parse seconds since epoch as a year value?

Hello DFDL community,

My binary input file contains the number of seconds since epoch for the start of a year.

For example, the number of seconds since epoch for the start of 1998 is: 883612800

I want the XML to just show the year (not month, day, and time).

For example, I want the XML to show this:

<Date>1998</Date>

I thought this would do the job:

<xs:element name="Date" type="xs:dateTime"
    dfdl:lengthKind="explicit" 
    dfdl:length="4" 
    dfdl:binaryCalendarRep="binarySeconds" 
    dfdl:calendarPattern="yyyy" 
    dfdl:calendarPatternKind="explicit"
    dfdl:lengthUnits="bytes" 
    dfdl:binaryCalendarEpoch="1970-01-01T00:00:00" />

But apparently that's not correct.

What is the correct way to do it, please?

/Roger 

Re: How to parse seconds since epoch as a year value?

Posted by Steve Lawrence <st...@gmail.com>.
binarySeconds only works for xs:dateTime elements, which means that the
resulting infoset will also have a day/month/year/hour/minute/second
parts. There's no way around that. Note that the dfdl:calendarPattern
does not describe the format of the infoset, but is used to describe the
format of input calendar textual data. The infoset will always be
YYYY-mm-dd hh:mm:ss.

If you wanted only the year, you would need to parse the field as a full
dateTime, and then use inputValueCalc to extract just the year. For example:

  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="dateTime" type="xs:dateTime"
          dfdl:lengthKind="explicit"
          dfdl:lengthUnits="bytes"
          dfdl:length="4"
          dfdl:binaryCalendarRep="binarySeconds"
          dfdl:binaryCalendarEpoch="1970-01-01T00:00:00" />
        <xs:element name="year" type="xs:int"
          dfdl:inputValueCalc="{ fn:year-from-dateTime(../dateTime) }" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>



On 10/1/19 8:38 AM, Costello, Roger L. wrote:
> Hello DFDL community,
> 
> My binary input file contains the number of seconds since epoch for the start of a year.
> 
> For example, the number of seconds since epoch for the start of 1998 is: 883612800
> 
> I want the XML to just show the year (not month, day, and time).
> 
> For example, I want the XML to show this:
> 
> <Date>1998</Date>
> 
> I thought this would do the job:
> 
> <xs:element name="Date" type="xs:dateTime"
>     dfdl:lengthKind="explicit" 
>     dfdl:length="4" 
>     dfdl:binaryCalendarRep="binarySeconds" 
>     dfdl:calendarPattern="yyyy" 
>     dfdl:calendarPatternKind="explicit"
>     dfdl:lengthUnits="bytes" 
>     dfdl:binaryCalendarEpoch="1970-01-01T00:00:00" />
> 
> But apparently that's not correct.
> 
> What is the correct way to do it, please?
> 
> /Roger 
>