[m-rev.] calendar module proposal
Ian MacLarty
maclarty at csse.unimelb.edu.au
Tue Jan 27 17:52:50 AEDT 2009
On Tue, Jan 27, 2009 at 5:01 PM, Paul Bone <pbone at csse.unimelb.edu.au> wrote:
> On Tue, Jan 27, 2009 at 04:02:11PM +1100, Ian MacLarty wrote:
>> Hi,
>>
>> Here's a proposal for a calendar module for the standard library.
>> Could interested people take a look and give me some feedback?
>> Since this module only implements the Gregorian calendar, it might not
>> be suitable for working with dates prior to 1582. Perhaps it should be
>> renamed to gregorian_calendar or gcalendar?
>
> I'd prefer gregorian_calendar.
>
Yes, I prefer that too.
>> Index: library/calendar.m
>> ===================================================================
>> RCS file: library/calendar.m
>> diff -N library/calendar.m
>> --- /dev/null 1 Jan 1970 00:00:00 -0000
>> +++ library/calendar.m 27 Jan 2009 03:51:25 -0000
>> @@ -0,0 +1,961 @@
>> +%-----------------------------------------------------------------------------%
>> +% vim: ft=mercury ts=4 sw=4 et wm=0 tw=0
>> +%-----------------------------------------------------------------------------%
>> +% Copyright (C) 2009 The University of Melbourne.
>> +% This file may only be copied under the terms of the GNU Library General
>> +% Public License - see the file COPYING.LIB in the Mercury distribution.
>> +%-----------------------------------------------------------------------------%
>> +%
>> +% File: calendar.m.
>> +% Main authors: maclarty
>> +% Stability: low.
>> +%
>> +% Proleptic Gregorian calendar utilities.
>> +%
>> +%-----------------------------------------------------------------------------%
>> +%-----------------------------------------------------------------------------%
>> +
>> +:- module calendar.
>> +:- interface.
>> +
>> +:- import_module io.
>> +
>> +%-----------------------------------------------------------------------------%
>> +
>> + % A point on the Proleptic Gregorian calendar, to the nearest second.
>> + %
>> +:- type date.
>> +
>> + % A period of time measured in years, months, days, hours, minutes and
>> + % seconds.
>> + %
>> +:- type duration.
>> +
>> +:- type month
>> + ---> january
>> + ; february
>> + ; march
>> + ; april
>> + ; may
>> + ; june
>> + ; july
>> + ; august
>> + ; september
>> + ; october
>> + ; november
>> + ; december.
>> +
>> +
>> + % Date components.
>> + %
>> +:- type year == int. % Year 0 is 1 BC, -1 is 2 BC, etc.
>> +:- type day_of_month == int. % 1..31 depending on the month and year
>> +:- type hour == int. % 0..23
>> +:- type minute == int. % 0..59
>> +:- type second == int. % 0..61 (60 and 61 are for leap seconds)
>
> Should microseconds be supported? Even if some system libraries don't
> allow access to the absolute time in mincroseconds it might still be
> useful to be able to use them.
>
Okay, I'll add support for that.
>> +
>> +:- type day_of_week
>> + ---> sunday
>> + ; monday
>> + ; tuesday
>> + ; wednesday
>> + ; thursday
>> + ; friday
>> + ; saturday.
>
> IMHO a week starts on Monday, so sunday should sort after monday (after
> saturday), but I'm not sure what is 'official'.
>
I'll change it to monday.
>
>> +%----------------------------------------------------------------------------%
>> +
>> +:- type date
>> + ---> date(
>> + dt_year :: int,
>> + dt_month :: int,
>> + dt_day :: int,
>> + dt_hour :: int,
>> + dt_minute :: int,
>> + dt_second :: int
>> + ).
>> +
>> +:- type duration
>> + ---> duration(
>> + dur_years :: int,
>> + dur_months :: int,
>> + dur_days :: int,
>> + dur_hours :: int,
>> + dur_minutes :: int,
>> + dur_seconds :: int
>> + ).
>> +
>
> The best representation of duration I've ever seen is Postgreql's
> internal INTERVAL structure. It represents durations in terms of just
> three values (the minimum possible number of values): months, days, and
> seconds, although it allows a user to use any unit to express the
> interval.
>
> I recommend taking a look at Postgresql's INTERVAL:
>
> http://www.postgresql.org/docs/8.3/interactive/datatype-datetime.html#AEN4976
>
Okay, thanks. I'll take a look and submit a revised module shortly.
At some point I'd also like to add some functions for custom
formatting of dates. Do you have any suggestions?
Ian.
--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to: mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions: mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------
More information about the reviews
mailing list