Thread: [threeten-develop] parsing difficulties
Status: Alpha
Brought to you by:
scolebourne
From: John C. <ca...@un...> - 2011-03-17 16:22:00
|
Hi: Following the javadoc for DateTimeFormatters.isoDateTime(): Returns the ISO date formatter that prints/parses a date, with the offset and zone if available, such as '2007-12-03T10:15:30', '2007-12-03T10:15:30+01:00' or '2007-12-03T10:15:30+01:00[Europe/Paris]'. I try to parse these three examples (code is below). 1) The last one fails, perhaps javadocs are out of date? 2) More generally, how do I know which XXXDateTime class to use, assuming I want to handle flexible input? Am I missing something simpler to use? thanks public class TestThreeten extends TestCase { public TestThreeten(String name) { super(name); } void testParse(String s) { DateTimeFormatter dtf = DateTimeFormatters.isoDateTime(); try { dtf.parse(s); } catch (Exception e) { System.out.printf("DateTimeFormatter Exception = %s%n", e.getMessage()); return; } try { ZonedDateTime date = ZonedDateTime.parse(s, dtf); System.out.printf("%s = %s%n",s, date); } catch (Exception e) { System.out.printf("ZonedDateTime Exception = %s%n", e.getMessage()); } System.out.printf("%n"); } public void testIsoDateTime() { testParse("2007-12-03T10:15:30"); testParse("2007-12-03T10:15:30+01:00"); testParse("2007-12-03T10:15:30+01:00[Europe/Paris]"); } } gives: ZonedDateTime Exception = Text '2007-12-03T10:15:30' could not be parsed into ZonedDateTime but was parsed to {ISO.LocalDateTime=2007-12-03T10:15:30} ZonedDateTime Exception = Text '2007-12-03T10:15:30+01:00' could not be parsed into ZonedDateTime but was parsed to {ISO.OffsetDateTime=2007-12-03T10:15:30+01:00} DateTimeFormatter Exception = Text '2007-12-03T10:15:30+01:00[Europe/Paris]' could not be parsed, unparsed text found at index 25 |
From: Stephen C. <sco...@jo...> - 2011-03-17 16:42:15
|
On 17 March 2011 16:21, John Caron <ca...@un...> wrote: > 1) The last one fails, perhaps javadocs are out of date? It looks like correct code and correct Javadoc at the moment, suggesting a bug. > 2) More generally, how do I know which XXXDateTime class to use, assuming I > want to handle flexible input? Am I missing something simpler to use? To handle the flexible case, you'd need to parse to a CalendricalMerger, call merge(), then check to see what you got. Stephen |
From: John C. <ca...@un...> - 2011-03-17 21:29:50
|
On 3/17/2011 10:42 AM, Stephen Colebourne wrote: > On 17 March 2011 16:21, John Caron<ca...@un...> wrote: >> 1) The last one fails, perhaps javadocs are out of date? > It looks like correct code and correct Javadoc at the moment, suggesting a bug. it was me not getting the classpath right. >> 2) More generally, how do I know which XXXDateTime class to use, assuming I >> want to handle flexible input? Am I missing something simpler to use? > To handle the flexible case, you'd need to parse to a > CalendricalMerger, call merge(), then check to see what you got. ok, now I have a Calendrical, but its not obvious what I can do with that. |
From: Stephen C. <sco...@jo...> - 2011-03-18 00:18:09
|
On 17 March 2011 21:29, John Caron <ca...@un...> wrote: >>> 2) More generally, how do I know which XXXDateTime class to use, assuming I >>> want to handle flexible input? Am I missing something simpler to use? >> To handle the flexible case, you'd need to parse to a >> CalendricalMerger, call merge(), then check to see what you got. > > ok, now I have a Calendrical, but its not obvious what I can do with that. Calendical c = ... ZonedDateTime zdt = c.get(ZonedDateTime.rule()); OffsetDateTime odt = c.get(OffsetDateTime.rule()); LocalDateTime ldt = c.get(LocalDateTime.rule()); check for nulls and use as appropriate. Design-wise, the only alternative that made any sense would have been some class with optional values, but that felt more confusing than just learning the low-level API. Stephen |
From: John C. <ca...@un...> - 2011-03-18 15:19:22
|
On 3/17/2011 6:18 PM, Stephen Colebourne wrote: > On 17 March 2011 21:29, John Caron<ca...@un...> wrote: >>>> 2) More generally, how do I know which XXXDateTime class to use, assuming I >>>> want to handle flexible input? Am I missing something simpler to use? >>> To handle the flexible case, you'd need to parse to a >>> CalendricalMerger, call merge(), then check to see what you got. >> ok, now I have a Calendrical, but its not obvious what I can do with that. > Calendical c = ... > ZonedDateTime zdt = c.get(ZonedDateTime.rule()); > OffsetDateTime odt = c.get(OffsetDateTime.rule()); > LocalDateTime ldt = c.get(LocalDateTime.rule()); > > check for nulls and use as appropriate. > > Design-wise, the only alternative that made any sense would have been > some class with optional values, but that felt more confusing than > just learning the low-level API. > > Stephen Ok, that seems to work. I notice that if I do a CalendricalMerger.toString(), it prints out the class that i end up needing, eg: Input 2007-12-03T10:15:30 Calendrical.toString() = {ISO.LocalDateTime=2007-12-03T10:15:30} Result = 2007-12-03T10:15:30 (javax.time.calendar.LocalDateTime) Input 2007-12-03T10:15:30+01:00 Calendrical.toString() = {ISO.OffsetDateTime=2007-12-03T10:15:30+01:00} Result = 2007-12-03T10:15:30+01:00 (javax.time.calendar.OffsetDateTime) Input 2007-12-03T10:15:30+01:00[Europe/Paris] Calendrical.toString() = {ISO.ZonedDateTime=2007-12-03T10:15:30+01:00[Europe/Paris]} Result = 2007-12-03T10:15:30+01:00[Europe/Paris] (javax.time.calendar.ZonedDateTime) I wonder if theres a way to make that available so I dont have to just try each possibility. I dont yet undertandd your internals enough to know if thats a reasonable suggestion thanks, John |
From: Stephen C. <sco...@jo...> - 2011-03-18 15:46:29
|
On 18 March 2011 15:19, John Caron <ca...@un...> wrote: > I notice that if I do a CalendricalMerger.toString(), it prints out the > class that i end up needing, eg: > > Input 2007-12-03T10:15:30 > Calendrical.toString() = {ISO.LocalDateTime=2007-12-03T10:15:30} > Result = 2007-12-03T10:15:30 (javax.time.calendar.LocalDateTime) > > Input 2007-12-03T10:15:30+01:00 > Calendrical.toString() = {ISO.OffsetDateTime=2007-12-03T10:15:30+01:00} > Result = 2007-12-03T10:15:30+01:00 (javax.time.calendar.OffsetDateTime) > > Input 2007-12-03T10:15:30+01:00[Europe/Paris] > Calendrical.toString() = > {ISO.ZonedDateTime=2007-12-03T10:15:30+01:00[Europe/Paris]} > Result = 2007-12-03T10:15:30+01:00[Europe/Paris] > (javax.time.calendar.ZonedDateTime) > > I wonder if theres a way to make that available so I dont have to just > try each possibility. I dont yet undertandd your internals enough to > know if thats a reasonable suggestion Essentially, the merger produces a map keyed by the rule. The map isn't exposed, except via the get(rule) method. While it might be possible to expose the map, is that really any more useful? You'd still have to check for the options. Perhaps you could explain how you are intending to use the data once its parsed? Or why you need multiple options? It would be good to determine if there are the right abstractions here. Stephen |
From: Benjamin G. <Ben...@gm...> - 2011-03-17 20:26:34
|
Hi John, I think you simply forgot this dependency (jsr-310-TZDB-all.jar). Add it and it should work Best Regards Benjamin On 17.03.2011 17:21, John Caron wrote: > Hi: > > Following the javadoc for DateTimeFormatters.isoDateTime(): > > Returns the ISO date formatter that prints/parses a date, with the offset and > zone if available, such as '2007-12-03T10:15:30', '2007-12-03T10:15:30+01:00' > or '2007-12-03T10:15:30+01:00[Europe/Paris]'. > > I try to parse these three examples (code is below). > > 1) The last one fails, perhaps javadocs are out of date? > > 2) More generally, how do I know which XXXDateTime class to use, assuming I > want to handle flexible input? Am I missing something simpler to use? > > thanks > > > public class TestThreeten extends TestCase { > > public TestThreeten(String name) { > super(name); > } > > void testParse(String s) { > DateTimeFormatter dtf = DateTimeFormatters.isoDateTime(); > > try { > dtf.parse(s); > } catch (Exception e) { > System.out.printf("DateTimeFormatter Exception = %s%n", e.getMessage()); > return; > } > > try { > ZonedDateTime date = ZonedDateTime.parse(s, dtf); > System.out.printf("%s = %s%n",s, date); > } catch (Exception e) { > System.out.printf("ZonedDateTime Exception = %s%n", e.getMessage()); > } > System.out.printf("%n"); > } > > public void testIsoDateTime() { > testParse("2007-12-03T10:15:30"); > testParse("2007-12-03T10:15:30+01:00"); > testParse("2007-12-03T10:15:30+01:00[Europe/Paris]"); > } > > } > > gives: > > ZonedDateTime Exception = Text '2007-12-03T10:15:30' could not be parsed into > ZonedDateTime but was parsed to {ISO.LocalDateTime=2007-12-03T10:15:30} > > ZonedDateTime Exception = Text '2007-12-03T10:15:30+01:00' could not be parsed > into ZonedDateTime but was parsed to > {ISO.OffsetDateTime=2007-12-03T10:15:30+01:00} > > DateTimeFormatter Exception = Text '2007-12-03T10:15:30+01:00[Europe/Paris]' > could not be parsed, unparsed text found at index 25 > > > ------------------------------------------------------------------------------ > Colocation vs. Managed Hosting > A question and answer guide to determining the best fit > for your organization - today and in the future. > http://p.sf.net/sfu/internap-sfd2d > > > _______________________________________________ > threeten-develop mailing list > thr...@li... > https://lists.sourceforge.net/lists/listinfo/threeten-develop |
From: John C. <ca...@un...> - 2011-03-17 20:55:52
|
yes, that was the problem, thanks very much! On 3/17/2011 2:26 PM, Benjamin Graf wrote: > Hi John, > > I think you simply forgot this dependency (jsr-310-TZDB-all.jar). Add > it and it should work > > Best Regards > Benjamin > > On 17.03.2011 17:21, John Caron wrote: >> Hi: >> >> Following the javadoc for DateTimeFormatters.isoDateTime(): >> >> Returns the ISO date formatter that prints/parses a date, with the >> offset and zone if available, such as '2007-12-03T10:15:30', >> '2007-12-03T10:15:30+01:00' or >> '2007-12-03T10:15:30+01:00[Europe/Paris]'. >> >> I try to parse these three examples (code is below). >> >> 1) The last one fails, perhaps javadocs are out of date? >> >> 2) More generally, how do I know which XXXDateTime class to use, >> assuming I want to handle flexible input? Am I missing something >> simpler to use? >> >> thanks >> >> >> public class TestThreeten extends TestCase { >> >> public TestThreeten(String name) { >> super(name); >> } >> >> void testParse(String s) { >> DateTimeFormatter dtf = DateTimeFormatters.isoDateTime(); >> >> try { >> dtf.parse(s); >> } catch (Exception e) { >> System.out.printf("DateTimeFormatter Exception = %s%n", >> e.getMessage()); >> return; >> } >> >> try { >> ZonedDateTime date = ZonedDateTime.parse(s, dtf); >> System.out.printf("%s = %s%n",s, date); >> } catch (Exception e) { >> System.out.printf("ZonedDateTime Exception = %s%n", >> e.getMessage()); >> } >> System.out.printf("%n"); >> } >> >> public void testIsoDateTime() { >> testParse("2007-12-03T10:15:30"); >> testParse("2007-12-03T10:15:30+01:00"); >> testParse("2007-12-03T10:15:30+01:00[Europe/Paris]"); >> } >> >> } >> >> gives: >> >> ZonedDateTime Exception = Text '2007-12-03T10:15:30' could not be >> parsed into ZonedDateTime but was parsed to >> {ISO.LocalDateTime=2007-12-03T10:15:30} >> >> ZonedDateTime Exception = Text '2007-12-03T10:15:30+01:00' could not >> be parsed into ZonedDateTime but was parsed to >> {ISO.OffsetDateTime=2007-12-03T10:15:30+01:00} >> >> DateTimeFormatter Exception = Text >> '2007-12-03T10:15:30+01:00[Europe/Paris]' could not be parsed, >> unparsed text found at index 25 >> >> >> ------------------------------------------------------------------------------ >> Colocation vs. Managed Hosting >> A question and answer guide to determining the best fit >> for your organization - today and in the future. >> http://p.sf.net/sfu/internap-sfd2d >> >> >> _______________________________________________ >> threeten-develop mailing list >> thr...@li... >> https://lists.sourceforge.net/lists/listinfo/threeten-develop > > > ------------------------------------------------------------------------------ > Colocation vs. Managed Hosting > A question and answer guide to determining the best fit > for your organization - today and in the future. > http://p.sf.net/sfu/internap-sfd2d > > > _______________________________________________ > threeten-develop mailing list > thr...@li... > https://lists.sourceforge.net/lists/listinfo/threeten-develop |
From: Morten H. <mor...@gm...> - 2011-03-17 21:25:54
|
In that case, the thrown Exception is less than explanatory, and need work: DateTimeFormatter Exception = Text '2007-12-03T10:15:30+01:00[Europe/Paris]' could not be parsed, unparsed text found at index 25 No mention of a missing TZDB, at all. My $0.02 worth. On 17 March 2011 21:55, John Caron <ca...@un...> wrote: > yes, that was the problem, thanks very much! > > > On 3/17/2011 2:26 PM, Benjamin Graf wrote: > > Hi John, > > I think you simply forgot this dependency (jsr-310-TZDB-all.jar). Add it > and it should work > > Best Regards > Benjamin > > On 17.03.2011 17:21, John Caron wrote: > > Hi: > > Following the javadoc for DateTimeFormatters.isoDateTime(): > > Returns the ISO date formatter that prints/parses a date, with the offset > and zone if available, such as '2007-12-03T10:15:30', > '2007-12-03T10:15:30+01:00' or '2007-12-03T10:15:30+01:00[Europe/Paris]'. > > I try to parse these three examples (code is below). > > 1) The last one fails, perhaps javadocs are out of date? > > 2) More generally, how do I know which XXXDateTime class to use, assuming I > want to handle flexible input? Am I missing something simpler to use? > > thanks > > > public class TestThreeten extends TestCase { > > public TestThreeten(String name) { > super(name); > } > > void testParse(String s) { > DateTimeFormatter dtf = DateTimeFormatters.isoDateTime(); > > try { > dtf.parse(s); > } catch (Exception e) { > System.out.printf("DateTimeFormatter Exception = %s%n", > e.getMessage()); > return; > } > > try { > ZonedDateTime date = ZonedDateTime.parse(s, dtf); > System.out.printf("%s = %s%n",s, date); > } catch (Exception e) { > System.out.printf("ZonedDateTime Exception = %s%n", e.getMessage()); > } > System.out.printf("%n"); > } > > public void testIsoDateTime() { > testParse("2007-12-03T10:15:30"); > testParse("2007-12-03T10:15:30+01:00"); > testParse("2007-12-03T10:15:30+01:00[Europe/Paris]"); > } > > } > > gives: > > ZonedDateTime Exception = Text '2007-12-03T10:15:30' could not be parsed > into ZonedDateTime but was parsed to {ISO.LocalDateTime=2007-12-03T10:15:30} > > > ZonedDateTime Exception = Text '2007-12-03T10:15:30+01:00' could not be > parsed into ZonedDateTime but was parsed to > {ISO.OffsetDateTime=2007-12-03T10:15:30+01:00} > > DateTimeFormatter Exception = Text > '2007-12-03T10:15:30+01:00[Europe/Paris]' could not be parsed, unparsed text > found at index 25 > > > ------------------------------------------------------------------------------ > Colocation vs. Managed Hosting > A question and answer guide to determining the best fit > for your organization - today and in the future.http://p.sf.net/sfu/internap-sfd2d > > > _______________________________________________ > threeten-develop mailing lis...@li...https://lists.sourceforge.net/lists/listinfo/threeten-develop > > > > ------------------------------------------------------------------------------ > Colocation vs. Managed Hosting > A question and answer guide to determining the best fit > for your organization - today and in the future.http://p.sf.net/sfu/internap-sfd2d > > > _______________________________________________ > threeten-develop mailing lis...@li...https://lists.sourceforge.net/lists/listinfo/threeten-develop > > > > > ------------------------------------------------------------------------------ > Colocation vs. Managed Hosting > A question and answer guide to determining the best fit > for your organization - today and in the future. > http://p.sf.net/sfu/internap-sfd2d > _______________________________________________ > threeten-develop mailing list > thr...@li... > https://lists.sourceforge.net/lists/listinfo/threeten-develop > > |
From: Stephen C. <sco...@jo...> - 2011-03-18 00:13:50
|
On 17 March 2011 21:25, Morten Hattesen <mor...@gm...> wrote: > In that case, the thrown Exception is less than explanatory, and need work: > > DateTimeFormatter Exception = Text '2007-12-03T10:15:30+01:00[Europe/Paris]' > could not be parsed, unparsed text found at index 25 > No mention of a missing TZDB, at all. Yes, not ideal. Stephen |
From: John C. <ca...@un...> - 2011-03-18 18:34:37
|
On 3/18/2011 9:37 AM, Stephen Colebourne wrote: > On 18 March 2011 15:19, John Caron<ca...@un...> wrote: >> I notice that if I do a CalendricalMerger.toString(), it prints out the >> class that i end up needing, eg: >> >> Input 2007-12-03T10:15:30 >> Calendrical.toString() = {ISO.LocalDateTime=2007-12-03T10:15:30} >> Result = 2007-12-03T10:15:30 (javax.time.calendar.LocalDateTime) >> >> Input 2007-12-03T10:15:30+01:00 >> Calendrical.toString() = {ISO.OffsetDateTime=2007-12-03T10:15:30+01:00} >> Result = 2007-12-03T10:15:30+01:00 (javax.time.calendar.OffsetDateTime) >> >> Input 2007-12-03T10:15:30+01:00[Europe/Paris] >> Calendrical.toString() = >> {ISO.ZonedDateTime=2007-12-03T10:15:30+01:00[Europe/Paris]} >> Result = 2007-12-03T10:15:30+01:00[Europe/Paris] >> (javax.time.calendar.ZonedDateTime) >> >> I wonder if theres a way to make that available so I dont have to just >> try each possibility. I dont yet undertandd your internals enough to >> know if thats a reasonable suggestion > Essentially, the merger produces a map keyed by the rule. The map > isn't exposed, except via the get(rule) method. While it might be > possible to expose the map, is that really any more useful? You'd > still have to check for the options. > > Perhaps you could explain how you are intending to use the data once > its parsed? Or why you need multiple options? It would be good to > determine if there are the right abstractions here. > > Stephen Hi Stephen: Thanks for taking time to think about this. I work with scientific data sets that have lots of dates, sometimes in the tens of thousands or more per file. The dates are encoded in 5-6 variants, including your 3 examples, eg without a time, without a time zone, using a timezone offset, etc. I need to read these into our general scientific data handling package. there are 2 things i need to do that i don't see immediately in your library. 1) a class that handles a number of variants of the date encoding. with the info above, i now see how to do that, the only question might be possible efficiency improvements. If dtp = c.get(ZonedDateTime.rule()); is cheap, then theres probably not a problem. Ill send the second in another email with a separate heading. > ------------------------------------------------------------------------------ > Colocation vs. Managed Hosting > A question and answer guide to determining the best fit > for your organization - today and in the future. > http://p.sf.net/sfu/internap-sfd2d > _______________________________________________ > threeten-develop mailing list > thr...@li... > https://lists.sourceforge.net/lists/listinfo/threeten-develop |
From: Stephen C. <sco...@jo...> - 2011-03-19 07:38:15
|
The Calendrical.get(rule) method should be reasonably performant, but its not been tested as such. Previous iterations had a class with lots of get methods that might or might not return null. I found that cumbersome, but you could create one yourself. Stephen On 3/18/11, John Caron <ca...@un...> wrote: > On 3/18/2011 9:37 AM, Stephen Colebourne wrote: >> On 18 March 2011 15:19, John Caron<ca...@un...> wrote: >>> I notice that if I do a CalendricalMerger.toString(), it prints out the >>> class that i end up needing, eg: >>> >>> Input 2007-12-03T10:15:30 >>> Calendrical.toString() = {ISO.LocalDateTime=2007-12-03T10:15:30} >>> Result = 2007-12-03T10:15:30 (javax.time.calendar.LocalDateTime) >>> >>> Input 2007-12-03T10:15:30+01:00 >>> Calendrical.toString() = {ISO.OffsetDateTime=2007-12-03T10:15:30+01:00} >>> Result = 2007-12-03T10:15:30+01:00 >>> (javax.time.calendar.OffsetDateTime) >>> >>> Input 2007-12-03T10:15:30+01:00[Europe/Paris] >>> Calendrical.toString() = >>> {ISO.ZonedDateTime=2007-12-03T10:15:30+01:00[Europe/Paris]} >>> Result = 2007-12-03T10:15:30+01:00[Europe/Paris] >>> (javax.time.calendar.ZonedDateTime) >>> >>> I wonder if theres a way to make that available so I dont have to just >>> try each possibility. I dont yet undertandd your internals enough to >>> know if thats a reasonable suggestion >> Essentially, the merger produces a map keyed by the rule. The map >> isn't exposed, except via the get(rule) method. While it might be >> possible to expose the map, is that really any more useful? You'd >> still have to check for the options. >> >> Perhaps you could explain how you are intending to use the data once >> its parsed? Or why you need multiple options? It would be good to >> determine if there are the right abstractions here. >> >> Stephen > > Hi Stephen: > > Thanks for taking time to think about this. > > I work with scientific data sets that have lots of dates, sometimes in > the tens of thousands or more per file. The dates are encoded in 5-6 > variants, including your 3 examples, eg without a time, without a time > zone, using a timezone offset, etc. I need to read these into our > general scientific data handling package. > > there are 2 things i need to do that i don't see immediately in your > library. > > 1) a class that handles a number of variants of the date encoding. with > the info above, i now see how to do that, the only question might be > possible efficiency improvements. If > > dtp = c.get(ZonedDateTime.rule()); > > is cheap, then theres probably not a problem. > > Ill send the second in another email with a separate heading. > > > >> ------------------------------------------------------------------------------ >> Colocation vs. Managed Hosting >> A question and answer guide to determining the best fit >> for your organization - today and in the future. >> http://p.sf.net/sfu/internap-sfd2d >> _______________________________________________ >> threeten-develop mailing list >> thr...@li... >> https://lists.sourceforge.net/lists/listinfo/threeten-develop > > > ------------------------------------------------------------------------------ > Colocation vs. Managed Hosting > A question and answer guide to determining the best fit > for your organization - today and in the future. > http://p.sf.net/sfu/internap-sfd2d > _______________________________________________ > threeten-develop mailing list > thr...@li... > https://lists.sourceforge.net/lists/listinfo/threeten-develop > -- Sent from my mobile device |