Code: Select all
; OS X date functions
; 0 = January 1, 2001
; constants
#DC_YEAR = 'y'
#DC_MONTH = 'M'
#DC_DAY = 'd'
#DC_HOUR = 'H'
#DC_MINUTE = 'm'
#DC_SECOND = 's'
; import required functions
ImportC ""
CFCalendarAddComponents(calendar, *at.d, options, *componentDesc, component)
CFCalendarComposeAbsoluteTime(calendar, *at.d, componentDesc.p-ascii, year, month, day, hour, minute, second)
CFCalendarCreateWithIdentifier(allocator, identifier)
CFCalendarDecomposeAbsoluteTime(calendar, at.d, *componentDesc, *component)
CFCalendarGetComponentDifference(calendar, at1.d, at2.d, options, *componentDesc, *component)
CFCalendarSetTimeZone(calendar, tz)
CFStringCreateWithCharacters(allocator, chars.p-unicode, numChars)
CFTimeZoneCreateWithTimeIntervalFromGMT(allocator, interval.d)
EndImport
; init some global variables
Global timezoneGMT = CFTimeZoneCreateWithTimeIntervalFromGMT(#Null, 0)
Global gregorian = CFCalendarCreateWithIdentifier(#Null, CFStringCreateWithCharacters(#Null, "gregorian", 9))
CFCalendarSetTimeZone(gregorian, timezoneGMT)
; date functions
Procedure.q QDate(Year = 0, Month = 1, Day = 1, Hour = 0, Minute = 0, Second = 0)
Protected at.d
If year
CFCalendarComposeAbsoluteTime(gregorian, @at, "yMdHms", Year, Month, Day, Hour, Minute, Second)
ProcedureReturn at
Else
ProcedureReturn Date() - 978307200
EndIf
EndProcedure
Procedure.q QDateAddComponent(QDate.q, Component, N)
Protected at.d = QDate
CFCalendarAddComponents(gregorian, @at, 0, @Component, N)
ProcedureReturn at
EndProcedure
Procedure QDateGetComponent(QDate.q, Component)
Protected result
CFCalendarDecomposeAbsoluteTime(gregorian, QDate, @Component, @result)
ProcedureReturn result
EndProcedure
Procedure QDateGetComponentDifference(QDate1.q, QDate2.q, Component)
Protected result
CFCalendarGetComponentDifference(gregorian, QDate1, QDate2, 0, @Component, @result)
ProcedureReturn result
EndProcedure
; test the code
d1.q = QDateAddComponent(QDate(), #DC_MONTH, 1); 1 month from now
Debug QDateGetComponent(d1, #DC_YEAR)
Debug QDateGetComponent(d1, #DC_MONTH)
d1.q = QDate(); now
d2.q = QDate(2012, 12, 1); dec 1, 2012
Debug QDateGetComponentDifference(d1, d2, #DC_DAY); show number of days between both dates