August 25, 2010
Okay. As I mentioned a week or so ago on this list, I've been working on a date/time module based on Boost, and since Yao G. has posted some work in that area, I thought that I would post what I have completed.

I have a struct based on Boost's date which has essentially same API with certain additions of my own. I did not use any of Boost's implementation or any of std.gregorian. In particular, Boost's implementation holds the date's values in a single long as the number of days, so it has to convert that value every time that you call a function on it. Mine holds the year, month, and day separately in order to reduce the number of conversions necessary. It also makes it take 4 bytes instead of 8. Also, my implementation is able to hold years from 32,768 B.C. to 32,767 A.D rather than being restricted to the range of 1400- Jan-01 to 9999-Dec-31 which boost is restricted to.

I have also implemented a TimeOfDay struct which holds the time of day in 24- hour time but has no concept of date (it holds the hour, minute, and second of the time), as well as a DateTime struct which combines my Date and TimeOfDay structs to give you both date and time functionality with the idea of using it for calendar-based operations (and even DateTime still only takes 8 bytes, which is the same as the boost implementation of just the date). It has no concept of time zone and has no connection to system time.

I'm still working on a SysTime struct based on boost's posix time which will hold the number of ticks (100 nanoseconds) since midnight on 0001-Jan-01 A.D. (rather than the time_t boost's holds), which will be connected to system time and definitely deal with time zones. I'm also still working on the duration and time interval stuff.

So, I'm attaching my Date, TimeOfDay, and DateTime structs along with various helper functions. I'm also including my unittests module which includes functions that I used in my unit tests. The ddoc pages for those 2 modules are also included. I have fully documented the modules and have extensive unit tests for them. There is still some work to be done on them once the duration and interval stuff is ironed out (like overloaded arithmetic operators), but it is essentially complete as is.

I'm also posting the datetime module stripped of unit tests here: http://ideone.com/9wou2

I have yet to really look at what Yao G. has done, but from his post, it sounds like it's pretty much a direct port of Boost's date, duration, and interval stuff. If that's the case, I expect that mine is better in that it has greater functionality, but having not looked at his code, I obviously can't comment on their comparative quality of implementation, though I do have a lot of unit tests to verify that my code is correct. In any case, I'm posting this so that others can look at it. Whether what I've done is used or what Yao G. has done is used (or something else entirely is used) is obviously up to Andrei and company. I will continue to work on my time duration and interval code, as well as my posix time code and will post that when it is completed (though I expect that that would happen this weekend at the absolute earliest).

So, here you go.

- Jonathan M Davis
-------------- next part --------------
A non-text attachment was scrubbed...
Name: datetime.tar.bz2
Type: application/x-bzip-compressed-tar
Size: 30911 bytes
Desc: not available
URL: <http://lists.puremagic.com/pipermail/phobos/attachments/20100825/04657eb1/attachment-0001.bin>