OLE Automation DateTime

Share your advanced PureBasic knowledge/code with the community.
User avatar
mk-soft
Always Here
Always Here
Posts: 6248
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

OLE Automation DateTime

Post by mk-soft »

In case anyone needs it ...
Minimum PB v6.00 (Beta 5) because oleaut32

Code: Select all

;-TOP

; Comment   : OLE Automation DateTime
; Author    : mk-soft
; Version   : v1.02.1
; Create    : 27.02.2022
; Update    : 07.03.2022

; OS        : Windows
; Compiler  : Purebasic v6.00

; *********************************************************

Import ""
  SystemTimeToTzSpecificLocalTime(lpTimeZoneInformation, lpUniversalTime, lpLocaleTime)
  TzSpecificLocalTimeToSystemTime(lpTimeZoneInformation, lpLocaleTime, lpUniversalTime)
  VarWeekdayName(iWeekday, fAbbrev, iFirstDay, dwFlags, *pbstrOut)
  VarMonthName(iMonth, fAbbrev, dwFlags, *pbstrOut)
  VarBstrFromDate(dateIn.d, lcid, dwFlags, *pbstrOut)
  VarFormatDateTime(*pvarIn.Variant, iNamedFormat, dwFlags, *pbstrOut)
EndImport

; Flags for GetStringFromDate

#VAR_TIMEVALUEONLY        = ($00000001)
#VAR_DATEVALUEONLY        = ($00000002)
#VAR_VALIDDATE            = ($00000004)
#VAR_CALENDAR_HIJRI       = ($00000008)
#VAR_LOCALBOOL            = ($00000010)
#VAR_FORMAT_NOSUBSTITUTE  = ($00000020)
#VAR_FOURDIGITYEARS       = ($00000040)
#VAR_CALENDAR_THAI        = ($00000080)
#VAR_CALENDAR_GREGORIAN   = ($00000100)

; Contants for GetStringFormatDate

Enumeration
  #GENERAL_DATE
  #LONG_DATE
  #SHORT_DATE
  #LONG_TIME
  #SHORT_TIME
EndEnumeration

; ---------------------------------------------------------

Procedure.d SetDate(Year, Month, Day, Hour, Minute, Second)
  Protected time.SYSTEMTIME, vTime.d
  
  With time
    \wYear = Year
    \wMonth = Month
    \wDay = Day
    \wHour = Hour
    \wMinute = Minute
    \wSecond = Second
  EndWith
  SystemTimeToVariantTime_(@time, @vTime)
 ProcedureReturn vTime
EndProcedure

Procedure.d GetDate(UTC=#False)
  Protected time.SYSTEMTIME, vTime.d
  If UTC
    GetSystemTime_(@time)
  Else
    GetLocalTime_(@time)
  EndIf
  SystemTimeToVariantTime_(@time, @vTime)
  ProcedureReturn vTime
EndProcedure

Procedure.d GetUTCDateToLocalDate(Date.d)
  Protected timeUTC.SYSTEMTIME, timeLocal.SYSTEMTIME, vTime.d
  VariantTimeToSystemTime_(Date, @timeUTC)
  SystemTimeToTzSpecificLocalTime(0, @timeUTC, @timeLocal)
  SystemTimeToVariantTime_(@timeLocal, @vTime)
  ProcedureReturn vTime
EndProcedure

Procedure.d GetLocalDateToUTCDate(Date.d)
  Protected timeUTC.SYSTEMTIME, timeLocal.SYSTEMTIME, vTime.d
  VariantTimeToSystemTime_(Date, @timeLocal)
  TzSpecificLocalTimeToSystemTime(0, @timeLocal, @timeUTC)
  SystemTimeToVariantTime_(@timeUTC, @vTime)
  ProcedureReturn vTime
EndProcedure

Procedure GetYear(Date.d)
  Protected time.SYSTEMTIME
  VariantTimeToSystemTime_(Date, @time)
  ProcedureReturn time\wYear
EndProcedure

Procedure GetMonth(Date.d)
  Protected time.SYSTEMTIME
  VariantTimeToSystemTime_(Date, @time)
  ProcedureReturn time\wMonth
EndProcedure

Procedure GetDay(Date.d)
  Protected time.SYSTEMTIME
  VariantTimeToSystemTime_(Date, @time)
  ProcedureReturn time\wDay
EndProcedure

Procedure GetHour(Date.d)
  Protected time.SYSTEMTIME
  VariantTimeToSystemTime_(Date, @time)
  ProcedureReturn time\wHour
EndProcedure

Procedure GetMinute(Date.d)
  Protected time.SYSTEMTIME
  VariantTimeToSystemTime_(Date, @time)
  ProcedureReturn time\wMinute
EndProcedure

Procedure GetSecond(Date.d)
  Protected time.SYSTEMTIME
  VariantTimeToSystemTime_(Date, @time)
  ProcedureReturn time\wSecond
EndProcedure

Procedure GetDayOfWeek(Date.d)
  Protected time.SYSTEMTIME
  VariantTimeToSystemTime_(Date, @time)
  ProcedureReturn time\wDayOfWeek
EndProcedure

Procedure.d AddDateValue(Date.d, Type, Value)
  Protected r1.d
  
  Select Type
    Case #PB_Date_Day
      r1 = Date + Value
    Case #PB_Date_Hour
      r1 = Date + (Value / 24.0)
    Case #PB_Date_Minute
      r1 = Date + (Value / 1440.0)
    Case #PB_Date_Second
      r1 = Date + (Value / 86400.0)
  EndSelect
  ProcedureReturn r1
EndProcedure

Procedure.d DiffDateValue(Date1.d, Date2.d, Type)
  Protected r1.d
  
  Select Type
    Case #PB_Date_Day
      r1 = (Date1 - Date2)
    Case #PB_Date_Hour
      r1 = (Date1 - Date2) * 24.0
    Case #PB_Date_Minute
      r1 = (Date1 - Date2) * 1440.0
    Case #PB_Date_Second
      r1 = (Date1 - Date2) * 86400.0
  EndSelect
  ProcedureReturn r1
EndProcedure

; ---------------------------------------------------------

Procedure.s GetNameOfWeek(Day, Short = 0)
  Protected s1.s, r1, *bstr
  
  If day <= 6
    Day + 1
  Else 
    day = 1
  EndIf
  r1 = VarWeekdayName(Day, Short, 1, 0, @*bstr)
  If r1 = #S_OK
    s1 = PeekS(*bstr)
    SysFreeString_(*bstr)
  Else
    Debug r1
  EndIf
  ProcedureReturn s1
EndProcedure

Procedure.s GetNameOfMonth(Month, Short = 0)
  Protected s1.s, r1, *bstr
  
  r1 = VarMonthName(Month, Short, 0, @*bstr)
  If r1 = #S_OK
    s1 = PeekS(*bstr)
    SysFreeString_(*bstr)
  Else
    Debug r1
  EndIf
  ProcedureReturn s1
EndProcedure

; ---------------------------------------------------------

Procedure.s GetStringFromDate(Date.d, Flags = 0)
  Protected s1.s, r1, *bstr
  
  r1 = VarBstrFromDate(Date, #LOCALE_USER_DEFAULT, Flags, @*bstr)
  If r1 = #S_OK
    s1 = PeekS(*bstr)
    SysFreeString_(*bstr)
  EndIf
  ProcedureReturn s1
EndProcedure

Procedure.s GetStringFormatDate(Date.d, Format = 0, Flags = 0)
  Protected s1.s, r1, var.variant, *bstr
  
  var\vt = #VT_DATE
  var\date = Date
  r1 = VarFormatDateTime(@var, Format, Flags, @*bstr)
  If r1 = #S_OK
    s1 = PeekS(*bstr)
    SysFreeString_(*bstr)
  EndIf
  ProcedureReturn s1
EndProcedure

Procedure.s GetSQLDateFromDate(Date.d)
  Protected s1.s, r1, time.SYSTEMTIME
  
  r1 = VariantTimeToSystemTime_(Date, @time)
  If r1
    With time
      s1 = "'" + RSet(Str(\wYear), 4, "0")
      s1 + "." + RSet(Str(\wMonth), 2, "0")
      s1 + "." + RSet(Str(\wDay), 2, "0")
      s1 + " " + RSet(Str(\wHour), 2, "0")
      s1 + ":" + RSet(Str(\wMinute), 2, "0")
      s1 + ":" + RSet(Str(\wSecond), 2, "0")
      s1 + ".000'"
    EndWith
  EndIf
  ProcedureReturn s1
EndProcedure

; *********************************************************

CompilerIf #PB_Compiler_IsMainFile
  
  ;-Test
  
  Debug "----"
  For i = 0 To 6
    Debug GetNameOfWeek(i)
  Next
  Debug "----"
  For i = 1 To 12
    Debug GetNameOfMonth(i,1)
  Next
  
  Debug "----"
  d1.d = GetDate()
  d2.d = GetDate(#True)
  Debug GetStringFromDate(d1)
  Debug GetStringFromDate(d2)
  Debug Round(DiffDateValue(d1, d2, #PB_Date_Second), #PB_Round_Nearest)
  
  Debug "----"
  Debug GetStringFormatDate(d1, #LONG_DATE)
  Debug GetStringFormatDate(d1, #SHORT_DATE)
  Debug GetStringFormatDate(d1, #LONG_TIME)
  Debug GetStringFormatDate(d1, #SHORT_TIME)
  
  
  d2.d = SetDate(2022, 2, 27, 12, 0, 0)
  Debug "----"
  Debug GetSQLDateFromDate(d1)
  Debug GetSQLDateFromDate(d2)
  
CompilerEndIf
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: OLE Automation DateTime

Post by Kwai chang caine »

Works perfecly here
Thanks for sharing 8)
ImageThe happiness is a road...
Not a destination
Post Reply