Extended FormatDate

Share your advanced PureBasic knowledge/code with the community.
horst
Enthusiast
Enthusiast
Posts: 197
Joined: Wed May 28, 2003 6:57 am
Location: Munich
Contact:

Extended FormatDate

Post by horst »

Code updated For 5.20+ (same As FormatDate())

Code: Select all

EnableASM
; --------------------------------------------
; Format PB Date (no time) thru Win API  (ASM)
; with localized day and month names (opt)
; --------------------------------------------
; Tokens in mask$  (case sensitive!) 
; yyyy   yy    Year (4/2 digits) 
; MM     M     Month, numeric (with/without leading zero) 
; MMMM   MMM   Month by name (long/short) 
; dd     d     Day (with/without leading zero)
; dddd   ddd   Day of week (long/short)

#DateBaseHigh = 27111902
#DateBaseLow = -717324288

Procedure.s FormatDateX(mask$,date_) 
  ft_.FILETIME : fs_.SYSTEMTIME 
  MOV Eax,date_ 
  MOV Ebx,10000000
  MUL Ebx 
  ADD Eax,#DateBaseLow 
  ADC Edx,#DateBaseHigh 
  MOV ft_\dwLowDateTime,Eax 
  MOV ft_\dwHighDateTime,Edx 
  FileTimeToSystemTime_(ft_,fs_)
  buf.s = Space(64)
  GetDateFormat_(#LOCALE_USER_DEFAULT,0,td,mask$,buf,64)
ProcedureReturn buf
EndProcedure

; test
Debug FormatDateX("dddd, d.MMMM yyyy",Date())
Debug FormatDateX("M/d/yyyy",Date())
[edit] I was playing with conversions. Of course this also works:

Code: Select all

EnableASM
Procedure.s FormatDateX(mask$,date_) 
  fs_.SYSTEMTIME 
  fs_\wYear = Year(date_)
  fs_\wMonth = Month(date_)
  fs_\wDay = Day(date_)
  fs_\wDayOfWeek = DayOfWeek(date_)
  buf.s = Space(64)
  GetDateFormat_(#LOCALE_USER_DEFAULT,0,td,mask$,buf,64)
ProcedureReturn buf
EndProcedure
Horst.