Date and Time Manipulation

Marielle Lange mlange at widged.com
Sat Oct 28 19:59:04 EDT 2006


> While we are on the topic of dates, I've been thinking about  
> creating a "countdown" calendar, clocking the number of days  
> remaining between today's date and some future date (March 31,  
> 20010 specifically).  Any tips on how I can do this?  Do I have to  
> convert dates into seconds in order to subtract one from the  
> other?  Thanks.


Hi Marian,

In case this helps, I wrote a minimalist countdown utility for  
christmas last year:
http://revolution.widged.com/stacks/?category=widgets_ecards
Christmas Countdown

You will also find below various date manipulation functions. They  
were written rapidly and haven't been extensively tested. You are  
very welcome to improve them.
That library can be found at <http://codes.widged.com/?q=node/1>,  
along with other code and libraries.

Other websites with useful codes are listed at:
<http://codes.widged.com/?q=node/660>

There are some time related tutorials at So smarts Software, for  
instance (<http://www.sosmartsoftware.com/? 
r=revolution_didacticiels&l=en>)

Marielle


/* ____________________________________________________________
|
|   Date Processing Routines
|
|   @Author:         Marielle  Lange
|   @Company:     Widged.com (http://widged.com)
|   @Date:            10 Apr 2006
|   @Version:        0.1
|   @Changes since last version:  N/A
|   @License:       Creative Commons Attribution 2.5 License  http:// 
creativecommons.org/licenses/by/2.5/
|   @Dependency:    -
*/

on DiffBetweenDates
   put field "DateFrom" into tDateFrom
   put field "DateTo" into tDateTo
   convert tDateFrom from system date to dateItems
   convert tDateTo from system date to dateItems
   put NbYearsBetweenTwoDates(tDateFrom,tDateTo) into field "NbYears"
   put NbMonthsBetweenTwoDates(tDateFrom,tDateTo) into field "NbMonths"
   put NbWeeksBetweenTwoDates(tDateFrom,tDateTo) into field "NbWeeks"
   put NbDaysBetweenTwoDates(tDateFrom,tDateTo) into field "NbDays"
end DiffBetweenDates


----------------------------------------------------------------------
--  WeekdayFirstOfMonth (function)
--
--
--
function WeekdayFirstOfMonth pYear, pMonth
   --- First of Month
   put pMonth & "/1/" & pYear into tDate
   convert tDate to dateItems
   return item 7 of tDate
end WeekdayFirstOfMonth

----------------------------------------------------------------------
-- NbDaysInMonth (function)
--
--
--
function NbDaysInMonth pYear, pMonth
   put (pMonth & "/1/" & pYear) into tDate
   convert tDate from date to dateItems
   put 0 into item 3 of tDate
   add 1 to item 2 of tDate
   convert tDate from dateItems to dateItems
   return (item 3 of tDate)
end NbDaysInMonth


----------------------------------------------------------------------
-- NbDaysBetweenTwoDates (function)
--
-- pStart and pEnd are in dateItems format
--
function NbDaysBetweenTwoDates pStart, pEnd
   put NbMonthsBetweenTwoDates(pStart, pEnd) into tMonthsDiff
   put (item 1 of pStart) into tStartYear
   put (item 2 of pStart) into tStartMonth
   repeat with x = 1 to tMonthsDiff
     if x = 1 then
       put tStartMonth into tMonth
       put tStartYear into tYear
       put empty into tDaysPerMonth
       -- put empty into message
     end if
     if tMonth > 12 then
       put 1 into tMonth
       add 1 to tYear
     end if
     put NbDaysInMonth(tYear,tMonth) into item x of tDaysPerMonth
     add 1 to tMonth
   end repeat
   put sum(tDaysPerMonth) into tNbDays
   return (tNbDays - (item 3 of pStart) + (item 3 of pEnd))
end NbDaysBetweenTwoDates

----------------------------------------------------------------------
-- NbWeeksBetweenTwoDates (function)
--
-- pStart and pEnd are in dateItems format
--
function NbWeeksBetweenTwoDates pStart, pEnd
   put NbDaysBetweenTwoDates(pStart, pEnd) into tNbDays
   return trunc(tNbDays/7)
end NbWeeksBetweenTwoDates


----------------------------------------------------------------------
-- NbMonthsBetweenTwoDates (function)
--
-- pStart and pEnd are in dateItems format
--
function NbMonthsBetweenTwoDates pStart, pEnd
   ----- Nb of Years, Months, weeks -----
   put NbYearsBetweenTwoDates(pStart, pEnd) into tNbYears
   put ((item 2 of pEnd) - (item 2 of pStart))  into tNbMonthsDiff
   ----- Handle cases were from 08/2005 to 06/2006 -----
   if tNbMonths < 0 then
     add 12 to tNbMonthsDiff
     add -1 to tNbYears
   end if
   return tNbMonthsDiff+ (12 * tNbYears) e
end NbMonthsBetweenTwoDates

----------------------------------------------------------------------
-- NbYearsBetweenTwoDates (function)
--
-- pStart and pEnd are in dateItems format
-- Return an integer, with the number of years
function NbYearsBetweenTwoDates pStart, pEnd
   return ((item 1 of pEnd) - (item 1 of pStart))
end NbYearsBetweenTwoDates


----------------------------------------------------------------------
-- MonthsAsArray (function)
--
-- Returns an Array with the Month Names, as MonthsA
--
function MonthsAsArray
   ----- Create an array with the Months Names -----
   put empty into MonthsA
   repeat with x = 1 to 12
     put x & "/1/00" into tDate
     convert tDate to long date
     put word 2 of tDate into MonthsA[x]
   end repeat
   return MonthsA
end MonthsAsArray

----------------------------------------------------------------------
--  weekNumber
--
--
--
function weekNumber pDateItems
   -- Needs the 7, because any day before may below to a week in the  
previous year
   put pDateItems into tJanuaryFirst
   put 1 into item 2 of tJanuaryFirst
   put 1 into item 3 of tJanuaryFirst
   convert tJanuaryFirst from dateitems to dateitems
   put 0 into tAdd; if item -1 of tJanuaryFirst <> 1 then put -1 into  
tAdd
   return (NbWeeksBetweenTwoDates(tJanuaryFirst,pDateItems) + tAdd)
end weekNumber

----------------------------------------------------------------------
-- StartDateIsBeforeEndOne
--
-- Returns true or false, according to situation
--
function StartDateIsBeforeEndOne pStart, pEnd
   put true into tTest
   -----  Checking that the Start date is earlier than the End one -----
   If item 1 of pStart > item 1 of pEnd then
     answer "problem here, the ending year is earlier than the  
starting one"
     put false into tTest
   else if (item 1 of pStart) = (item 1 of pEnd) and (item 2 of  
pStart) > (item 2 of pEnd) then
     answer "problem here, the ending month is earlier than the  
starting one (in the same year)"
     put pStart & cr & pEnd
     put false into tTest
   else if (item 2 of pStart) = (item 2 of pEnd) and (item 3 of  
pStart) > (item 3 of pEnd) then
     answer "problem here, the ending day is earlier than the  
starting one (in the same month)"
     put false into tTest
   end if
   return tTest
end StartDateIsBeforeEndOne






More information about the Use-livecode mailing list