$title Calendar Function Examples (CALENDAR,SEQ=183) $onText Calendar Function Examples GAMS Development Corporation, Formulation and Language Example. The Date and Time Functions are: Serial = Jstart (start of Gams Job) Serial = JNow (current date/time stamp) Year = GYear (serial) Month = GMonth (serial) Day = GDay (serial) Hours = GHour (serial) Minute = GMinute(serial) Second = GSecond(serial) DoW = GDoW (serial) (1=Monday,2=Tuesday,..) Leap = GLeap (serial) (0=no leap year, 1=leap year) DSerial = JDate(Year,Month,Day) (full days) TSerial = JTime(Hour,Minute,Second); (fraction of day) Inputs to the J(ulian) Functions are Gregorian dates and the G(regorian) Functions are days since January 1, 1900. The Jstart/Jnow return a serial number that measures the time elapsed since January 1, 1900, at 00:00:00 in days. Note the relationship below: jstart == jdate(gyear(jstart),gmonth (jstart),gday (jstart)) + Jtime(ghour(jstart),gminute(jstart),gsecond(jstart)) Keywords: GAMS language features, calendar functions $offText $eolCom // Scalar start 'date + time at start of GAMS job' now 'current date + time'; Scalar year, month, day, hour, minute, second, dow, leap, date, time, diff, sdate, stime, diff; start = jstart; now = jnow; year = gyear(start); month = gmonth (start); day = gday (start); hour = ghour(start); minute = gminute(start); second = gsecond(start); dow = gdow (start); leap = gleap(start); display start, now, year, month, day, hour, minute, second, dow, leap; date = jdate(year,month,day); time = jtime(hour,minute,second); diff = start - (date + time); sdate = floor(start); stime = mod(start,1); display date, time, diff, sdate, stime; * get resolution of jnow by looking at the first 5 changes Scalar test, i, old, new, sec; new = jnow; for(i = 1 to 5, old = new; while(old = new, new = jnow;); // burn time until Jnow changes test = new - old; display test; sec = gsecond(new) - gsecond(old); display sec; ); * now we want to know when to celebrate the year 2000 Scalar s2000, days2000, hours2000, min2000, sec2000; s2000 = jdate(2000,1,1) - jnow; days2000 = floor(s2000); hours2000 = floor(mod(s2000,1)*24); min2000 = floor(mod(s2000*24,1)*60); sec2000 = mod(s2000*24*60,1)*60; display 'all truncated numbers', days2000, hours2000, min2000, sec2000; days2000 = s2000; hours2000 = mod(days2000,1)*24; min2000 = mod(hours2000,1)*60; sec2000 = mod(min2000,1)*60; display 'all fractional numbers', days2000, hours2000, min2000, sec2000; * print a calendar for a number of years Set w / Mon, Tue, Wed, Thu, Fri, Sat, Sun / m / January, February, March, April, May, June, July, August, September, October, November, December / y / 1997, 1998, 1999, 2000 /; Parameter dim(y,m) 'days in month' ym(y) 'year' sm(m) 'next month'; sm(m--1) = ord(m); ym(y) = ord(y) + 1996; dim(y,m) = jdate(ym(y) + (card(m) = ord(m)),sm(m),1) - jdate(ym(y),ord(m),1) display sm, dim; File calendar; put calendar @12 'C a l e n d a r' / @12 '---------------' /; loop(y, put / / @13 'Year = ' y.tl loop(m, put / / @15 ,m.tl /; loop(w, put w.tl:>5;); old = 1; for(i = 1 to dim(y,m), date = jdate(ym(y),ord(m),i); put$old / ; put @((gdow(date) - 1)*5 + 1) i:5:0; old = calendar.cc >= card(w)*5; ); ); ); * print a calendar from today for 400 days File calendar; put / / / / @12 'C a l e n d a r' / @12 '---------------' /; month = 0; for(i = jstart to jstart + 400, if(month <> gmonth(i), month = gmonth(i); put / / @15 ,month:2:0 '/' gyear(i):4:0 /; loop(w, put w.tl:>5;); put /; ); put$(calendar.cc >= card(w)*5) /; put @((gdow(i) - 1)*5 + 1) gday(i):5:0; );