Some pilot error here. I did find two places with ss.SSS and another with 
ss.SSSSSS, so by changing to SSSSSS everywhere now I get 6 digits, and per that 
ICU4J description, times like 32.000003 unparse to 32.000000, as expected.

-mikeb
________________________________
From: Steve Lawrence <stephen.d.lawre...@gmail.com>
Sent: Wednesday, October 14, 2020 3:41 PM
To: dev@daffodil.apache.org <dev@daffodil.apache.org>
Subject: Re: issue with calendarPattern with SSSSSS not unparsing to 000000

I'm pretty sure we just use ICU4J for unparsing times.

We do have custom code to parse the XML infoset dateTime in
DFDLCalendarConversion.scala. So it's possible we're just parsing that
string from the infoset incorrectly. Skimming that code to see if
there's something obviously wrong, I see this comment in timePartFromString:

// ICU only supports integer milliseconds precision, which means we can
// only support at most 3 digits from the milliseconds field

And in timePartToString I see that we get the subsecond part and pad
three 0's when creating the infoset.

Seems like ICU doesn't support that much precision, and I'd guess it
doesn't padd to the number of S's in the pattern.

Might be another case where ICU behavior and the DFDL specification
don't agree.

On 10/14/20 3:15 PM, Beckerle, Mike wrote:
> I did not find JIRA tickets for this issue. Just want to see if anyone has 
> insight/workaround for this.
>
> This problem occurs for Daffodil 2.4.0 and 2.7.0
>
> I have a schema with
>
> <xs:element
>   name="TimestampNano"
>   type="xs:dateTime"
>   dfdl:calendarPattern="yyyy-MM-dd'T'HH:mm:ss.SSSSSSZZZZZ" />
>
> Notice the 6 S in SSSSSS.
>
> This parses this fine:
>
> 2003-08-24T05:14:15.000003-07:00
>
> producing this XML Infoset:
>
> <TimestampNano>2003-08-24T05:14:15.000003-07:00</TimestampNano>
>
> So it appears that Daffodil supports microseconds. But that unparses to:
>
> 2003-08-24T05:14:15.000-07:00
>
> This appears to be a bug. DFDL Spec says:
>
> When the number of "S" symbols in a pattern exceeds the supported accuracy, 
> excess fractional seconds are truncated from the right (not rounded) when 
> parsing, and zeros are added to the right when unparsing. For example, a DFDL 
> processor allows up to six "S" symbols and has millisecond accuracy; for 
> pattern "ss.SSSSSS", data "12.345678" would be parsed into Infoset xs:time 
> "00:00:12:345", which would be unparsed into data "12.345000".
>
> This suggests I should be getting all 6 characters for SSSSSS, even if
> it loses precision of the 000003 I should get 000000.
>
> But I should not be getting just 000.
>
> A bug? Suggestions for how to work around?
>

Reply via email to