(!******************************************************
Mosel Example Problems
======================
file dates.mos
``````````````
Working with dates and times.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, Nov. 2007, rev. Apr. 2020
*******************************************************!)
model "Dates and time"
uses "mmsystem", "mmjobs"
! **** Print current date and time with default format
writeln("Today: ", date(SYS_NOW), ", current time: ", time(SYS_NOW))
declarations
t: time
d,d2: date
now1,now2: datetime
DNAMES: array(1..7) of string
Dates: set of date
YEAR: array(NDates: set of integer) of integer
TList: list of time
DList: list of date
DTList: list of datetime
end-declarations
! **** Change the date and time formats for reading and writing
setparam("timefmt", "%h%p") ! h: hours in 1-12, p: am/pm
setparam("datefmt", "%m-%d-%y") ! m: month, d: day, y: year
initializations from "datetime.dat"
t as "Time1"
d as "Date1"
end-initializations
writeln(d, ", ", t)
setparam("timefmt", "%Hh%0M") ! H: hours in 0-23, M: minutes
setparam("datefmt", "%0d/%0m/%0Y") ! Y: year in 0-99
! 0: fill spaces with '0'
initializations from "datetime.dat"
t as "Time2"
d as "Date2"
end-initializations
writeln(d, ", ", t)
setparam("timefmt", "%H:%0M:%0S") ! S: seconds
setparam("datefmt", "%d-%N-%y") ! N: use month names
initializations from "datetime.dat"
t as "Time3"
d as "Date3"
end-initializations
writeln(d, ", ", t)
(! ****
The predefined month names may be changed (e.g., translated) by
specifying the names to be used.
!)
setparam("datefmt", "%d %N %y")
setparam("monthnames", "janvier fevrier mars avril mai juin juillet " +
"aout septembre octobre novembre decembre")
initializations from "datetime.dat"
d as "Date4"
end-initializations
writeln(d)
(! ****
Transformations between dates and numbers:
Using the Julian Day number (obtained with 'getasnumber').
!)
setparam("datefmt", "") ! Back to default format
initializations from "datetime.dat"
Dates
end-initializations
writeln("Dates: ", Dates)
forall(dd in Dates) YEAR(getasnumber(dd)):= getyear(dd)
writeln("YEAR: ", YEAR)
forall(n in NDates) writeln(date(n)) ! Mapping back to original dates
! **** Validity check
d:= date(2000,0,0)
writeln(d, " is a valid date: ", if(isvalid(d), "true", "false"))
d2:= date(getasnumber(d))
writeln(d2, " is a valid date: ", if(isvalid(d2), "true", "false"))
t:= time(25,0)
writeln(t, " is a valid time: ", if(isvalid(t), "true", "false"))
t:= time(1,61)
writeln(t, " is a valid time: ", if(isvalid(t), "true", "false"))
(! ****
Definition of constant dates:
using dates as index set
!)
declarations
someday=date(2020,3,24) ! A constant date
SD: set of date ! Set of date references
SDC: set of constant date ! Set of constant date references
AD: dynamic array(SDC) of real ! Array indexed by 'date'
end-declarations
! Operations on a set of dates
SD:= {date(2020,3,24), date(2020,3,24)+1}
writeln("SD=", SD)
writeln("Is someday in SD? ", someday in SD) ! Output: false
writeln("Next day in SD? ", someday+1 in SD) ! Output: false
SD+= {date(2020,3,24), date(2020,3,24)+1}
writeln("SD after addition: ", SD, " size=", SD.size) ! Output: size=4
! Operations on a set of constant dates
SDC:= {date(2020,3,24),date(2020,3,24)+1}
writeln("SDC=", SDC)
writeln("Is someday in SDC? ", someday in SDC) ! Output: true
writeln("Next day in SDC? ", someday+1 in SDC) ! Output: true
SDC+= {date(2020,3,24), date(2020,3,24)+1}
writeln("SDC after addition: ", SDC, " size=", SDC.size) ! Output: size=2
! Using a dates as index set
AD(date(2020,3,24)):=10; AD(date(2020,3,25)):=20.5
writeln("AD=",AD) ! AD=[(2020-03-24,10),(2020-03-25,20.5)]
AD(someday):=30.2; AD(someday+1):=40
writeln("AD after changes:",AD) ! AD=[(2020-01-01,30.2),(2020-03-25,40)]
! **** Sorting lists of dates and times
DList:= [date(2021,1,1),date(1900,1,2),date(2020,3,24)]
DTList:= sum(i in DList) [datetime(i,time(0))]
writeln("DL=", DList) ! DL=[2021-1-1,1900-01-02,2020-03-24]
qsort(SYS_UP, DList)
writeln("DL=", DList) ! DL=[1900-01-02,2020-03-24,2021-1-1]
writeln("DTL=", DTList)
qsort(SYS_UP, DTList)
writeln("DTL=", DTList)
TList:= [time(12,0),time(10,30),time(16,15),time(8,45)]
writeln("TL=", TList) ! TL=[12:00:00,10:30:00,16:15:00,8:45:00]
qsort(SYS_UP, TList)
writeln("TL=", TList) ! TL=[8:45:00,10:30:00,12:00:00,16:15:00]
! **** Operations on dates and times
! Difference between dates
writeln("February 2004 had ", date(2004,3,1)-date(2004,2,1), " days.")
! Retrieve the weekday
DNAMES:: (1..7)["Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
"Saturday", "Sunday"]
writeln("1st January 2000 was a ", DNAMES(getweekday(date(2000,1,1))))
! Difference between times
now1:= datetime(SYS_NOW)
wait(1) ! Delay model execution for 1 second
now2:= datetime(SYS_NOW)
writeln("Time elapsed between ", now1, " and ", now2, ": ", now2-now1, "ms")
! Enumeration / addition to 'time'
setparam("timefmt", "%.h.%0M%p")
t:= time(11,0)
forall(i in 1..10) do
writeln(t)
t+=15*60*1000 ! Add 15 minutes
end-do
! Enumeration / addition to 'date'
setparam("datefmt", "%.d/%0m/%0Y") ! '.': fill spaces with blanks
d:= date(2005,12,20)
forall(i in 1..5) do
writeln(d)
d+=14 ! Add 14 days
end-do
end-model
|
!@encoding ISO8859-1
(!******************************************************
Mosel Example Problems
======================
file dates2.mos
```````````````
Working with dates and times.
!!! This file and its data file contain some non-ASCII
!!! characters that may not display properly depending
!!! on your system settings and the character encoding(s)
!!! supported by the editor you are using to visualize
!!! the files
The encoding of this file can be changed, for example to UTF-8,
by using the 'xprnls' tool from the command line:
xprnls conv -f ISO8859-1 -t UTF-8 -o dates_utf.mos dates2.mos
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, Nov. 2007, rev. Apr. 2020
*******************************************************!)
model "Dates and time"
uses "mmsystem", "mmjobs"
! **** Print current date and time with default format
writeln("Today: ", date(SYS_NOW), ", current time: ", time(SYS_NOW))
declarations
t: time
d,d2: date
now1,now2: datetime
DNAMES: array(1..7) of string
Dates: set of date
YEAR: array(NDates: set of integer) of integer
TList: list of time
DList: list of date
DTList: list of datetime
end-declarations
! **** Change the date and time formats for reading and writing
setparam("timefmt", "%h%p") ! h: hours in 1-12, p: am/pm
setparam("datefmt", "%m-%d-%y") ! m: month, d: day, y: year
initializations from "datetime2.dat"
t as "Time1"
d as "Date1"
end-initializations
writeln(d, ", ", t)
setparam("timefmt", "%Hh%0M") ! H: hours in 0-23, M: minutes
setparam("datefmt", "%0d/%0m/%0Y") ! Y: year in 0-99
! 0: fill spaces with '0'
initializations from "datetime2.dat"
t as "Time2"
d as "Date2"
end-initializations
writeln(d, ", ", t)
setparam("timefmt", "%H:%0M:%0S") ! S: seconds
setparam("datefmt", "%d-%N-%y") ! N: use month names
initializations from "datetime2.dat"
t as "Time3"
d as "Date3"
end-initializations
writeln(d, ", ", t)
(! ****
The predefined month names may be changed (e.g., translated) by
specifying the names to be used.
!)
setparam("datefmt", "%d %N %y")
setparam("monthnames", "janvier f�vrier mars avril mai juin juillet " +
"ao�t septembre octobre novembre d�cembre")
initializations from "datetime2.dat"
d as "Date4"
end-initializations
writeln(d)
(! ****
Transformations between dates and numbers:
Using the Julian Day number (obtained with 'getasnumber').
!)
setparam("datefmt", "") ! Back to default format
initializations from "datetime2.dat"
Dates
end-initializations
writeln("Dates: ", Dates)
forall(dd in Dates) YEAR(getasnumber(dd)):= getyear(dd)
writeln("YEAR: ", YEAR)
forall(n in NDates) writeln(date(n)) ! Mapping back to original dates
! **** Validity check
d:= date(2000,0,0)
writeln(d, " is a valid date: ", if(isvalid(d), "true", "false"))
d2:= date(getasnumber(d))
writeln(d2, " is a valid date: ", if(isvalid(d2), "true", "false"))
t:= time(25,0)
writeln(t, " is a valid time: ", if(isvalid(t), "true", "false"))
t:= time(1,61)
writeln(t, " is a valid time: ", if(isvalid(t), "true", "false"))
(! ****
Definition of constant dates:
using dates as index set
!)
declarations
someday=date(2020,3,24) ! A constant date
SD: set of date ! Set of date references
SDC: set of constant date ! Set of constant date references
AD: dynamic array(SDC) of real ! Array indexed by 'date'
end-declarations
! Operations on a set of dates
SD:= {date(2020,3,24), date(2020,3,24)+1}
writeln("SD=", SD)
writeln("Is someday in SD? ", someday in SD) ! Output: false
writeln("Next day in SD? ", someday+1 in SD) ! Output: false
SD+= {date(2020,3,24), date(2020,3,24)+1}
writeln("SD after addition: ", SD, " size=", SD.size) ! Output: size=4
! Operations on a set of constant dates
SDC:= {date(2020,3,24),date(2020,3,24)+1}
writeln("SDC=", SDC)
writeln("Is someday in SDC? ", someday in SDC) ! Output: true
writeln("Next day in SDC? ", someday+1 in SDC) ! Output: true
SDC+= {date(2020,3,24), date(2020,3,24)+1}
writeln("SDC after addition: ", SDC, " size=", SDC.size) ! Output: size=2
! Using a dates as index set
AD(date(2020,3,24)):=10; AD(date(2020,3,25)):=20.5
writeln("AD=",AD) ! AD=[(2020-03-24,10),(2020-03-25,20.5)]
AD(someday):=30.2; AD(someday+1):=40
writeln("AD after changes:",AD) ! AD=[(2020-01-01,30.2),(2020-03-25,40)]
! **** Sorting lists of dates and times
DList:= [date(2021,1,1),date(1900,1,2),date(2020,3,24)]
DTList:= sum(i in DList) [datetime(i,time(0))]
writeln("DL=", DList) ! DL=[2021-1-1,1900-01-02,2020-03-24]
qsort(SYS_UP, DList)
writeln("DL=", DList) ! DL=[1900-01-02,2020-03-24,2021-1-1]
writeln("DTL=", DTList)
qsort(SYS_UP, DTList)
writeln("DTL=", DTList)
TList:= [time(12,0),time(10,30),time(16,15),time(8,45)]
writeln("TL=", TList) ! TL=[12:00:00,10:30:00,16:15:00,8:45:00]
qsort(SYS_UP, TList)
writeln("TL=", TList) ! TL=[8:45:00,10:30:00,12:00:00,16:15:00]
! **** Operations on dates and times
! Difference between dates
writeln("February 2004 had ", date(2004,3,1)-date(2004,2,1), " days.")
! Retrieve the weekday
DNAMES:: (1..7)["Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
"Saturday", "Sunday"]
writeln("1st January 2000 was a ", DNAMES(getweekday(date(2000,1,1))))
! Difference between times
now1:= datetime(SYS_NOW)
wait(1) ! Delay model execution for 1 second
now2:= datetime(SYS_NOW)
writeln("Time elapsed between ", now1, " and ", now2, ": ", now2-now1, "ms")
! Enumeration / addition to 'time'
setparam("timefmt", "%.h.%0M%p")
t:= time(11,0)
forall(i in 1..10) do
writeln(t)
t+=15*60*1000 ! Add 15 minutes
end-do
! Enumeration / addition to 'date'
setparam("datefmt", "%.d/%0m/%0Y") ! '.': fill spaces with blanks
d:= date(2005,12,20)
forall(i in 1..5) do
writeln(d)
d+=14 ! Add 14 days
end-do
end-model
|