[date_time]facet questions

I have a common function to output dates to sql strings. It works like this: std::locale sqllocale(database_type db_type) { switch (db_type) { case MSAccess: return std::locale(std::locale::classic(), new dt::date_facet("#%m/%d/%Y#")); case MSSQLServer: return std::locale(std::locale::classic(), new dt::date_facet("{ d '%Y-%m-%d' }")); ... } } std::ostringstream ss; ss.imbue(sqllocale(MSAccess)); ss << "SELECT * FROM tbl WHERE somedate=" << dt::date(2006,11,24); Now I need to put dates into an excel spreadsheet which uses a date formatted as a date duration. This can't be expressed via the formatters so I created my own facet but discovered some strange things: 1. The "put" function of the date_facet calls "do_put_tm" instead of just "do_put" like standard facets. 2. The virtual "do_put_tm" function takes a struct tm instead of a date argument. Unfortunatly this means extra work. My code now looks like this: case MSExcel: { struct excel_date_facet : public dt::date_facet { excel_date_facet(::size_t ref_count = 0) : dt::date_facet(ref_count) { } virtual std::ostreambuf_iterator<char> do_put_tm( std::ostreambuf_iterator<char> next, std::ios_base& a_ios, char_type fill_char, const tm& tm_value, string_type a_format) const { // Here I now got the date as a struct tm which is pretty useless // when I want to calculate a date duration. // convert it back to a date dt::date d = dt::date_from_tm(tm_value); // +2 here because Excel starts on 1900-0-0 and treats 1900 // as a leap year (!) unsigned long days = ((d - dt::date(1900,1,1)).days() + 2); return std::use_facet<std::num_put<char> >(a_ios.getloc()).put( next, a_ios, fill_char, days ); } }; // struct excel_date_facet return std::locale(std::locale::classic(), new excel_date_facet()); } Can I recommend that the date_facet is changed so that "put" calls "do_put" which converts to a struct tm and calls a "do_put_tm" function. And another question: I asked a long time ago why the default formatting for dates is "2006-Nov-24" instead of the current locale formatting. Don't remember the answer now but I had a look in the TR2 proposal for date_time and saw that it remains that way. Why should something in a standard don't follow the current locale?

More date_time facet comments: It is not possible to set the date duration format. Date durations are streamed using the number format. This means that I can't set it to the XML schema standard for durations [-]PnnD (e.g -P120D for -120 days)

Martin Adrian wrote:
More date_time facet comments:
It is not possible to set the date duration format. Date durations are streamed using the number format.
This means that I can't set it to the XML schema standard for durations [-]PnnD (e.g -P120D for -120 days)
Sadly this is true. To do it, we need a new format specifier, a new method in the date_facet, etc. I'm thinking maybe %dd for the specifier? And then you'd want a method to set the format like this: date_facet* df = new date_facet(); df->date_duration_format("%-P%ddD"); where the %- controls the sign output. Of course it could default to something like this. Thoughts? Jeff
participants (2)
-
Jeff Garland
-
Martin Adrian