New Features in Maple 2018 - Dates, Times, and the Calendar Package - Maplesoft

What's New in Maple 2018

Dates, Times, and the Calendar Package

With a new Calendar package, Maple 2018 makes it easier to work with dates and times, such as analyzing time-dependent data, or calculating the flight duration to your next conference.  

Maple 2018 includes new data structures that represent dates and times. There are numerous functions for working with dates and times, including fundamental operations such as date arithmetic and more advanced functionality for working with Calendars. Existing packages such as Finance also support the new Date object. 




Dates, Times, and Clocks 

  • New objects representing dates, times, and clocks were introduced in Maple 2018.
  • The Now method for a clock creates a Time object representing the current time according to the indicated clock.  

now := Now( SystemUTCClock );

Typesetting:-mrow(Typesetting:-mi(

  • From a given Time object, you can create a corresponding Date object, as follows.

today := Date( now );

Typesetting:-mrow(Typesetting:-mi(

  • Or, more simply, use the Date constructor without arguments.

today := Date();

Typesetting:-mrow(Typesetting:-mi(

  • Various fields of the Date object are accessible.

Year( today );

2018

DayOfMonth( today );

28

Minute( today );

1

  • Arithmetic with Date and Time objects is builtin.
  • To compute the amount of time between two dates represented as Date objects, just subtract them.

d1 := Date( 2017, 12, 25 );

Typesetting:-mrow(Typesetting:-mi(

d2 := Date( 2000, 12, 25 );

Typesetting:-mrow(Typesetting:-mi(

t := d1 - d2;

Typesetting:-mprintslash([t := `+`(`*`(536457600000, `*`(Unit(ms))))], [`+`(`*`(536457600000, `*`(Units:-Unit(ms))))])

convert( t, 'units', 'days' );

Typesetting:-mprintslash([`+`(`*`(6209, `*`(Unit(d))))], [`+`(`*`(6209, `*`(Units:-Unit(d))))])

(For more control over the units used in computing the time between two dates, use the DateDifference command in the Calendar package).

  • In fact, any affine combination of Date objects results in an expression involving units of time.
  • A convex combination of Date objects results in another Date object.  For instance, to compute the average value of two Date objects, you can use an expression such as the following one.

( d1 + d2 ) / 2;

Typesetting:-mrow(Typesetting:-mi(

  • You can specify a date in a particular time zone by using the timezone option to the Date constructor. Suppose, for example, that a flight leaves Toronto at 8 p.m. on March 12, 2007, and arrives in Paris at 9 a.m. on March 13.

depart := Date( 2007, 3, 12, 20, 44, 'timezone' = "America/Toronto" );

Typesetting:-mrow(Typesetting:-mi(

arrive := Date( 2007, 3, 13, 9, 3, 'timezone' = "Europe/Paris" );

Typesetting:-mrow(Typesetting:-mi(

  • To compute the flight time, simply subtract the two dates.

flight_time := arrive - depart;

Typesetting:-mprintslash([flight_time := `+`(`*`(26340000, `*`(Unit(ms))))], [`+`(`*`(26340000, `*`(Units:-Unit(ms))))])

convert( flight_time, 'units', 'hours' );

Typesetting:-mprintslash([`+`(`*`(`/`(439, 60), `*`(Unit(h))))], [`+`(`*`(`/`(439, 60), `*`(Units:-Unit(h))))])

The Calendar Package 

  • The Calendar package provides a number of useful routines for working with dates.

with( Calendar );

[AdjustDateField, DateDifference, DayOfWeek, DayOfYear, DaysInMonth, DaysInYear, HostTimeZone, IsDaylightSavingTime, IsLeapYear, IsWeekend, JulianDayNumber, ModifiedJulianDayNumber, Today]
[AdjustDateField, DateDifference, DayOfWeek, DayOfYear, DaysInMonth, DaysInYear, HostTimeZone, IsDaylightSavingTime, IsLeapYear, IsWeekend, JulianDayNumber, ModifiedJulianDayNumber, Today]

  • For example, you can check whether a year is a leap year.

IsLeapYear( 2000 );

true

IsLeapYear( 1900 );

false

  • You can compute the day of the week or year for any given date. For example, Christmas of 2017 occurred on a Monday.

DayOfWeek( 2017, 12, 25 );

2

  • And, it was the 359-th day of the year.

DayOfYear( 2017, 12, 25 );

359

  • Since Date objects can be specified with respect to particular time zones, it is useful to be able to determine the time zone of computer on which Maple is running.  To do this, use the HostTimeZone command.

HostTimeZone();

Canada/Eastern

  • The DateDifference command gives you finer control over the units used to compute the time difference between two dates.  For our flight example above, we can compute as follows.

DateDifference( depart, arrive, 'units' = 'h' );

Typesetting:-mprintslash([`+`(`*`(`/`(439, 60), `*`(Unit(h))))], [`+`(`*`(`/`(439, 60), `*`(Units:-Unit(h))))])

  • It is sometimes more convenient to use "mixed" units in the output, as illustrated here:

DateDifference( depart, arrive, 'units' = 'mixed' );

Typesetting:-mprintslash([`+`(`*`(7, `*`(Unit(h))), `*`(19, `*`(Unit(min))))], [`+`(`*`(7, `*`(Units:-Unit(h))), `*`(19, `*`(Units:-Unit(min))))])

  • The AdjustDateField command provides for the ability to add amounts to individual Date object fields, such as the month or the hour of the day.

d := Date( 2000, 1, 14, 10, 55, 3 );

Typesetting:-mrow(Typesetting:-mi(

AdjustDateField( d, "minute", -3 );

Typesetting:-mrow(Typesetting:-mi(

  • Notice the effect of adding many months to the date here:

AdjustDateField( d, "month", 30 );

Typesetting:-mrow(Typesetting:-mi(

  • By default, changes to a particular date field can potentially lead to changes to date fields at a higher level of granularity.  The method = "roll" option confines modifications to a single field, keeping its values within the valid ranges for that field.

AdjustDateField( d, "month", 30, 'method' = "roll" );

Typesetting:-mrow(Typesetting:-mi(

  • The default behavior is obtained by using the method = "add" option.

AdjustDateField( d, "month", 30, 'method' = "add" );

Typesetting:-mrow(Typesetting:-mi(