Dates on OS X

Mac OSX specific forum
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3942
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Dates on OS X

Post by wilbert »

Some simple date functionality

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