Advanced Date Formating

Share your advanced PureBasic knowledge/code with the community.
User avatar
StarBootics
Addict
Addict
Posts: 1006
Joined: Sun Jul 07, 2013 11:35 am
Location: Canada

Advanced Date Formating

Post by StarBootics »

Hello,

This is my first source contribution to this forum. It's a different version of the code found here : http://www.purebasic.fr/english/viewtop ... 12&t=45340 Thanks to Mohawk70 for the original source code.

With this advanced date formatting instruction it's possible to format a date like : "%ldd %lmm %dd%eds, %yyyy" --> Saturday July 27th, 2013
It's more an extension to the standard FormatDate(), the extra mask tags are :
  • %smm : Short month name
    %lmm : Long month name
    %sdd : Short day name
    %ldd : Long day name
    %eds : Extra day sign ("st" for first, "nd" for second, "rd" for third, "th" for fourth and so on)
And most of all, it's fully compatible with the standard date mask tags used by FormatDate(). This code can be used freely if it suits your needs but it is being distributed without warranty of any kind.

Regards
StarBootics

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; AUTOMATICALLY GENERATED CODE, DO NOT MODIFY
; UNLESS YOU REALLY, REALLY, REALLY MEAN IT !!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code generated by : Dev-Type V4.0.0
; Project name : Advanced Date Formatting
; File name : Advanced Date Formatting.pb
; File Version : 1.0.0
; Programmation : OK
; Programmed by : StarBootics
; E-mail : starbootics@cgocable.ca
; Creation Date : 27-07-2013
; Last update : 27-07-2013
; Coded for : PureBasic 5.20 beta 7
; Platform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Structure declaration <<<<<

Structure DateFormatting

  ShortMonth.s[12]
  LongMonth.s[12]
  ShortDay.s[7]
  LongDay.s[7]
  ExtraDaySign.s[31]

EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The observators <<<<<

Macro GetDateFormattingShortMonth(DateFormattingA, ShortMonthID)
  
  DateFormattingA\ShortMonth[ShortMonthID]
  
EndMacro

Macro GetDateFormattingLongMonth(DateFormattingA, LongMonthID)
  
  DateFormattingA\LongMonth[LongMonthID]
  
EndMacro

Macro GetDateFormattingShortDay(DateFormattingA, ShortDayID)
  
  DateFormattingA\ShortDay[ShortDayID]
  
EndMacro

Macro GetDateFormattingLongDay(DateFormattingA, LongDayID)
  
  DateFormattingA\LongDay[LongDayID]
  
EndMacro

Macro GetDateFormattingExtraDaySign(DateFormattingA, ExtraDaySignID)
  
  DateFormattingA\ExtraDaySign[ExtraDaySignID]
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The mutators <<<<<

Macro SetDateFormattingShortMonth(DateFormattingA, ShortMonthID, P_ShortMonth)
  
  GetDateFormattingShortMonth(DateFormattingA, ShortMonthID) = P_ShortMonth
  
EndMacro

Macro SetDateFormattingLongMonth(DateFormattingA, LongMonthID, P_LongMonth)
  
  GetDateFormattingLongMonth(DateFormattingA, LongMonthID) = P_LongMonth
  
EndMacro

Macro SetDateFormattingShortDay(DateFormattingA, ShortDayID, P_ShortDay)
  
  GetDateFormattingShortDay(DateFormattingA, ShortDayID) = P_ShortDay
  
EndMacro

Macro SetDateFormattingLongDay(DateFormattingA, LongDayID, P_LongDay)
  
  GetDateFormattingLongDay(DateFormattingA, LongDayID) = P_LongDay
  
EndMacro

Macro SetDateFormattingExtraDaySign(DateFormattingA, ExtraDaySignID, P_ExtraDaySign)
  
  GetDateFormattingExtraDaySign(DateFormattingA, ExtraDaySignID) = P_ExtraDaySign
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Reset operator <<<<<

Macro ResetDateFormatting(DateFormattingA)
  
  For ShortMonthID = 0 To 11
    SetDateFormattingShortMonth(DateFormattingA, ShortMonthID, "")
    SetDateFormattingLongMonth(DateFormattingA, ShortMonthID, "")
  Next
  
  For ShortDayID = 0 To 6
    SetDateFormattingShortDay(DateFormattingA, ShortDayID, "")
    SetDateFormattingLongDay(DateFormattingA, ShortDayID, "")
  Next
  
  For ExtraDaySignID = 0 To 30
    SetDateFormattingExtraDaySign(DateFormattingA, ExtraDaySignID, "")
  Next
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code generated in : 00.011 seconds (14090.91 lines/second) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Initialize operator <<<<<

Procedure InitializeDateFormatting(*DateFormattingA.DateFormatting, Flag.b)
  
  Select Flag
      
    Case 0
      
      SetDateFormattingShortMonth(*DateFormattingA, 00, "Jan")
      SetDateFormattingShortMonth(*DateFormattingA, 01, "Feb")
      SetDateFormattingShortMonth(*DateFormattingA, 02, "Mar")
      SetDateFormattingShortMonth(*DateFormattingA, 03, "Apr")
      SetDateFormattingShortMonth(*DateFormattingA, 04, "May")
      SetDateFormattingShortMonth(*DateFormattingA, 05, "Jun")
      SetDateFormattingShortMonth(*DateFormattingA, 06, "Jul")
      SetDateFormattingShortMonth(*DateFormattingA, 07, "Aug")
      SetDateFormattingShortMonth(*DateFormattingA, 08, "Sep")
      SetDateFormattingShortMonth(*DateFormattingA, 09, "Oct")
      SetDateFormattingShortMonth(*DateFormattingA, 10, "Nov")
      SetDateFormattingShortMonth(*DateFormattingA, 11, "Dec")
      
      SetDateFormattingLongMonth(*DateFormattingA, 00, "January")
      SetDateFormattingLongMonth(*DateFormattingA, 01, "February")
      SetDateFormattingLongMonth(*DateFormattingA, 02, "March")
      SetDateFormattingLongMonth(*DateFormattingA, 03, "April")
      SetDateFormattingLongMonth(*DateFormattingA, 04, "May")
      SetDateFormattingLongMonth(*DateFormattingA, 05, "June")
      SetDateFormattingLongMonth(*DateFormattingA, 06, "July")
      SetDateFormattingLongMonth(*DateFormattingA, 07, "August")
      SetDateFormattingLongMonth(*DateFormattingA, 08, "September")
      SetDateFormattingLongMonth(*DateFormattingA, 09, "October")
      SetDateFormattingLongMonth(*DateFormattingA, 10, "November")
      SetDateFormattingLongMonth(*DateFormattingA, 11, "December")
      
      SetDateFormattingShortDay(*DateFormattingA, 00, "Sun")
      SetDateFormattingShortDay(*DateFormattingA, 01, "Mon")
      SetDateFormattingShortDay(*DateFormattingA, 02, "Tue")
      SetDateFormattingShortDay(*DateFormattingA, 03, "Wed")
      SetDateFormattingShortDay(*DateFormattingA, 04, "Thu")
      SetDateFormattingShortDay(*DateFormattingA, 05, "Fri")
      SetDateFormattingShortDay(*DateFormattingA, 06, "Sat")
      
      SetDateFormattingLongDay(*DateFormattingA, 00, "Sunday")
      SetDateFormattingLongDay(*DateFormattingA, 01, "Monday")
      SetDateFormattingLongDay(*DateFormattingA, 02, "Tuesday")
      SetDateFormattingLongDay(*DateFormattingA, 03, "Wednesday")
      SetDateFormattingLongDay(*DateFormattingA, 04, "Thursday")
      SetDateFormattingLongDay(*DateFormattingA, 05, "Friday")
      SetDateFormattingLongDay(*DateFormattingA, 06, "Saturday")
      
      For ExtraDaySignID = 1 To 31
        
        Select ExtraDaySignID
            
          Case 1, 21, 31
            SetDateFormattingExtraDaySign(*DateFormattingA, ExtraDaySignID-1, "st")
            
          Case 2, 22
            SetDateFormattingExtraDaySign(*DateFormattingA, ExtraDaySignID-1, "nd")
            
          Case 3, 23
            SetDateFormattingExtraDaySign(*DateFormattingA, ExtraDaySignID-1, "rd")
            
          Default
            SetDateFormattingExtraDaySign(*DateFormattingA, ExtraDaySignID-1, "th")
            
        EndSelect
        
      Next
      
    Case 1
      
      SetDateFormattingShortMonth(*DateFormattingA, 00, "Jan")
      SetDateFormattingShortMonth(*DateFormattingA, 01, "Fév")
      SetDateFormattingShortMonth(*DateFormattingA, 02, "Mar")
      SetDateFormattingShortMonth(*DateFormattingA, 03, "Avr")
      SetDateFormattingShortMonth(*DateFormattingA, 04, "Mai")
      SetDateFormattingShortMonth(*DateFormattingA, 05, "Jun")
      SetDateFormattingShortMonth(*DateFormattingA, 06, "Jul")
      SetDateFormattingShortMonth(*DateFormattingA, 07, "Aoû")
      SetDateFormattingShortMonth(*DateFormattingA, 08, "Sep")
      SetDateFormattingShortMonth(*DateFormattingA, 09, "Oct")
      SetDateFormattingShortMonth(*DateFormattingA, 10, "Nov")
      SetDateFormattingShortMonth(*DateFormattingA, 11, "Déc")
      
      SetDateFormattingLongMonth(*DateFormattingA, 00, "Janvier")
      SetDateFormattingLongMonth(*DateFormattingA, 01, "Février")
      SetDateFormattingLongMonth(*DateFormattingA, 02, "Mars")
      SetDateFormattingLongMonth(*DateFormattingA, 03, "Avril")
      SetDateFormattingLongMonth(*DateFormattingA, 04, "Mai")
      SetDateFormattingLongMonth(*DateFormattingA, 05, "Juin")
      SetDateFormattingLongMonth(*DateFormattingA, 06, "Juillet")
      SetDateFormattingLongMonth(*DateFormattingA, 07, "Août")
      SetDateFormattingLongMonth(*DateFormattingA, 08, "Septembre")
      SetDateFormattingLongMonth(*DateFormattingA, 09, "Octobre")
      SetDateFormattingLongMonth(*DateFormattingA, 10, "Novembre")
      SetDateFormattingLongMonth(*DateFormattingA, 11, "Décembre")
      
      SetDateFormattingShortDay(*DateFormattingA, 00, "Dim")
      SetDateFormattingShortDay(*DateFormattingA, 01, "Lun")
      SetDateFormattingShortDay(*DateFormattingA, 02, "Mar")
      SetDateFormattingShortDay(*DateFormattingA, 03, "Mer")
      SetDateFormattingShortDay(*DateFormattingA, 04, "Jeu")
      SetDateFormattingShortDay(*DateFormattingA, 05, "Ven")
      SetDateFormattingShortDay(*DateFormattingA, 06, "Sam")
      
      SetDateFormattingLongDay(*DateFormattingA, 00, "Dimanche")
      SetDateFormattingLongDay(*DateFormattingA, 01, "Lundi")
      SetDateFormattingLongDay(*DateFormattingA, 02, "Mardi")
      SetDateFormattingLongDay(*DateFormattingA, 03, "Mercredi")
      SetDateFormattingLongDay(*DateFormattingA, 04, "Jeudi")
      SetDateFormattingLongDay(*DateFormattingA, 05, "Vendredi")
      SetDateFormattingLongDay(*DateFormattingA, 06, "Samedi")
      
      For ExtraDaySignID = 1 To 31
        
        Select ExtraDaySignID
            
          Case 1
            SetDateFormattingExtraDaySign(*DateFormattingA, ExtraDaySignID-1, "er")
            
          Default
            SetDateFormattingExtraDaySign(*DateFormattingA, ExtraDaySignID-1, "")
            
        EndSelect
        
      Next
      
  EndSelect
  
EndProcedure

Procedure.s FormatDateEx(*DateFormattingA.DateFormatting, Mask.s, Date.i)
  
  FormattedDate.s = FormatDate(Mask, Date)
  
  If FindString(FormattedDate, "%smm", 1)
    FormattedDate = ReplaceString(FormattedDate, "%smm", GetDateFormattingShortMonth(*DateFormattingA, Month(Date) - 1), #PB_String_NoCase, 1)
  EndIf 
  
  If FindString(FormattedDate, "%lmm", 1)
    FormattedDate = ReplaceString(FormattedDate, "%lmm", GetDateFormattingLongMonth(*DateFormattingA, Month(Date) - 1), #PB_String_NoCase, 1)
  EndIf 
  
  If FindString(FormattedDate, "%sdd", 1)
    FormattedDate = ReplaceString(FormattedDate, "%sdd", GetDateFormattingShortDay(*DateFormattingA, DayOfWeek(Date)), #PB_String_NoCase, 1)
  EndIf 
  
  If FindString(FormattedDate, "%ldd", 1)
    FormattedDate = ReplaceString(FormattedDate, "%ldd", GetDateFormattingLongDay(*DateFormattingA, DayOfWeek(Date)), #PB_String_NoCase, 1)
  EndIf 
  
  If FindString(FormattedDate, "%eds", 1)
    FormattedDate = ReplaceString(FormattedDate, "%eds", GetDateFormattingExtraDaySign(*DateFormattingA, Day(Date)-1), #PB_String_NoCase, 1)
  EndIf 
  
  ProcedureReturn FormattedDate
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
; <<<<< !!! WARNING - YOU ARE NOW IN A TESTING ZONE - WARNING !!! <<<<< 
; <<<<< !!! WARNING - THIS CODE SHOULD BE COMMENTED - WARNING !!! <<<<< 
; <<<<< !!! WARNING - BEFORE THE FINAL COMPILATION. - WARNING !!! <<<<< 
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 

Macro AddElementEx(ListName, Element)
  
  AddElement(ListName)
  ListName = Element
  
EndMacro

NewList DateMask.s()

AddElementEx(DateMask(), "A=%yyyy, M=%mm, J=%dd")
AddElementEx(DateMask(), "%yyyy-%mm-%dd")
AddElementEx(DateMask(), "%dd-%mm-%yyyy")
AddElementEx(DateMask(), "%dd %lmm %yyyy")
AddElementEx(DateMask(), "%dd %smm %yyyy")
AddElementEx(DateMask(), "%ldd %lmm %dd%eds, %yyyy")
AddElementEx(DateMask(), "%dd-%mm-%yyyy - %hh:%ii:%ss")
AddElementEx(DateMask(), "%ldd - %dd %lmm %yyyy")
AddElementEx(DateMask(), "%lmm %dd%eds, %yyyy")
AddElementEx(DateMask(), "%dd%eds %lmm %yyyy")
AddElementEx(DateMask(), "%dd%eds %lmm %yyyy - %hh:%ii:%ss")
AddElementEx(DateMask(), "%dd %lmm %yyyy - %dd-%mm-%yyyy")

Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Testing with the English setting"
Debug ""

InitializeDateFormatting(DateFormatting.DateFormatting, 0)

ForEach DateMask()
  Debug FormatDateEx(DateFormatting, DateMask(), Date())
Next

Debug ""

For DayID = 1 To 31
  Debug FormatDateEx(DateFormatting, "%lmm %dd%eds, %yyyy", Date(2014, 01, DayID, 0, 0, 0))
Next

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Testing with the French setting"
Debug ""

InitializeDateFormatting(DateFormatting, 1)

ForEach DateMask()
  Debug FormatDateEx(DateFormatting, DateMask(), Date())
Next

Debug ""

For DayID = 1 To 31
  Debug FormatDateEx(DateFormatting, "%dd%eds %lmm %yyyy", Date(2014, 01, DayID, 0, 0, 0))
Next

ResetDateFormatting(DateFormatting)

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
The Stone Age did not end due to a shortage of stones !
Mohawk70
Enthusiast
Enthusiast
Posts: 404
Joined: Thu May 11, 2006 1:04 am
Location: Florida, USA

Re: Advanced Date Formating

Post by Mohawk70 »

Glad to see you found it useful & welcome to the forum :D
User avatar
Michael Vogel
Addict
Addict
Posts: 2808
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Re: Advanced Date Formating

Post by Michael Vogel »

That's what I'm using so far (windows only)...

Code: Select all

Procedure.s LocalDateFormat(format.s,date.i)
	
	Protected result.s=Space(64)
	Protected time.SYSTEMTIME
	
	With time
		\wYear=Year(date)
		\wMonth=Month(date)
		\wDay=Day(date)
		\wHour=Hour(date)
		\wMinute=Minute(date)
		\wSecond=Second(date)
	EndWith
	
	If GetDateFormat_(#LOCALE_USER_DEFAULT,#Null,@time,@format,@result,64)
		ProcedureReturn PeekS(@result)
	Else
		ProcedureReturn format
	EndIf

EndProcedure
Procedure.s MyFormatDate(mask.s,date.i)
	
	Protected month.s
	Protected point.i
	
	month=LocalDateFormat("MMMM",Date)
	If Len(month)>3
		point=#True
	EndIf
	
	mask=ReplaceString(mask,"%MMMM",month,#PB_String_NoCase)
	mask=ReplaceString(mask,"%MMM.",LocalDateFormat("MMM",Date)+Left(".",point),#PB_String_NoCase)
	mask=ReplaceString(mask,"%MMM",LocalDateFormat("MMM",Date),#PB_String_NoCase)
	mask=ReplaceString(mask,"%MM",LocalDateFormat("MM",Date),#PB_String_NoCase)
	mask=ReplaceString(mask,"%M",LocalDateFormat("M",Date),#PB_String_NoCase)
	mask=ReplaceString(mask,"%DD",RSet(Str(Day(date)),2,"0"),#PB_String_NoCase)
	mask=ReplaceString(mask,"%D",Str(Day(date)),#PB_String_NoCase)
	
	mask=FormatDate(mask,date)
	
	mask=ReplaceString(mask,"%H",Str(Hour(date)),#PB_String_NoCase)
	mask=ReplaceString(mask,"%I",Str(Minute(date)),#PB_String_NoCase)
	mask=ReplaceString(mask,"%S",Str(Second(date)),#PB_String_NoCase)
	
	ProcedureReturn mask
	
EndProcedure

Debug MyFormatDate("%DD. %MM. %yyyy, %d.%m.'%yy %yy, (%MMMM / %MMM. /%MMM), %HH:%II:%SS, %h:%i:%s",Date())
Little John
Addict
Addict
Posts: 4791
Joined: Thu Jun 07, 2007 3:25 pm
Location: Berlin, Germany

Re: Advanced Date Formating

Post by Little John »

User avatar
TI-994A
Addict
Addict
Posts: 2741
Joined: Sat Feb 19, 2011 3:47 am
Location: Singapore
Contact:

Re: Advanced Date Formating

Post by TI-994A »

Hello StarBootics. Nice code! Here's another cross-platform version that makes use of data blocks to support English, French, and German, and can be easily adapted for more languages by simply adding to the data section. There's also a procedure to display the time in three formats, including military style:

Code: Select all

EnableExplicit
Enumeration
  #Long
  #Short
  #English
  #French
  #German
  #Military
EndEnumeration

Procedure.s ordinalSuffix(day.i)
  Define ordSuffix.s
  Select day
    Case 1, 21, 31
      ordSuffix = "st "
    Case 2, 22
      ordSuffix = "nd "
    Case 3, 23
      ordSuffix = "rd "
    Default
      ordSuffix = "th "
  EndSelect
  ProcedureReturn ordSuffix
EndProcedure

Procedure.s FormatTime(date.i = 0, format.i = 0)
  Define.s meridian, hour, hr.i
  
  If Not date
    date = Date()
  EndIf
  
  hr = Hour(date)
  
  If format = #Military
    hour = RSet(Str(hr), 2, "0")
    meridian = "hrs"
  Else
    If hr > 12
      hour = Str(hr - 12) + ":"
    Else
      If hr = 0 : hr = 12 : EndIf
      hour = Str(hr) + ":"
    EndIf
  EndIf
  
  If Not format
    If hr > 11
      meridian = "pm"
    Else
      meridian = "am"
    EndIf
  EndIf    
  
  ProcedureReturn hour + Str(Minute(date)) + meridian
EndProcedure

Procedure.s FormatDateEx(date.i, format.i, lang.i)
  Define.s d, m, y, dateString, ordSuffix = " "
  Define.i L, dw, dd, mm, yy, dayOffset, monthOffset, JJ = 3, Mar = 3
  
  dw = DayOfWeek(date) + 1
  dd = Day(date)
  mm = Month(date)
  yy = Year(date)
  
  Select lang
    Case #English
      ordSuffix = ordinalSuffix(dd)
    Case #French
      dayOffset = 7
      monthOffset = 12
      If dw = 3
        Mar = 4
      EndIf
      If mm = 6 Or mm = 7
        JJ = 4
      EndIf
    Case #German
      dayOffset = 14
      monthOffset = 24
  EndSelect  
  
  Restore Days
  For L = 1 To (dw + dayOffset) : Read.s d : Next
  Restore Months
  For L = 1 To (mm + monthOffset) : Read.s m : Next
  
  Select format
    Case #Long
      dateString = d + ", " + Str(dd) + ordSuffix + 
                   m + ", " + Str(yy)
    Case #Short
      dateString = Left(d, Mar) + ", " + Str(dd) + " " + 
                   Left(m, JJ) + " '" + Right(Str(yy), 2)
  EndSelect
  
  ProcedureReturn dateString
EndProcedure

Debug "English formatted date & normal time:"
Debug FormatDateEx(Date(), #Long, #English)
Debug FormatDateEx(Date(), #Short, #English) +
                  " - " + FormatTime()
Debug " "
Debug "French formatted date & short time:"
Debug FormatDateEx(Date(), #Long, #French)
Debug FormatDateEx(Date(), #Short, #French) +
                   " - " + FormatTime(0, #Short)
Debug " "
Debug "German formatted date & military time:"
Debug FormatDateEx(Date(), #Long, #German)
Debug FormatDateEx(Date(), #Short, #German) +
                   " - " + FormatTime(0, #Military)
DataSection
  Months:
    Data.s "January", "February", "March", "April", "May", "June"
    Data.s "July", "August", "September", "October", "November", "December"
    Data.s "Janvier", "Février", "Mars", "Avril", "Mai", "Juin"
    Data.s "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"
    Data.s "Januar", "Februar", "März", "April", "Mai", "Juni"
    Data.s "Juli", "August", "September", "Oktober", "November", "Dezember"
  Days:
    Data.s "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
    Data.s "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"
    Data.s "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"
EndDataSection
There's a small exception implemented for the French section, where the months of June & July (Juin & Juillet), and the day name Tuesday (Mardi) display four characters for the short date format, instead of three, to avoid confusion (Jui, Jui, Mar). :)
Texas Instruments TI-99/4A Home Computer: the first home computer with a 16bit processor, crammed into an 8bit architecture. Great hardware - Poor design - Wonderful BASIC engine. And it could talk too! Please visit my YouTube Channel :D
User avatar
StarBootics
Addict
Addict
Posts: 1006
Joined: Sun Jul 07, 2013 11:35 am
Location: Canada

Re: Advanced Date Formating

Post by StarBootics »

TI-994A wrote:Hello StarBootics. Nice code! Here's another cross-platform version that makes use of data blocks to support English, French, and German, and can be easily adapted for more languages by simply adding to the data section. There's also a procedure to display the time in three formats, including military style ...
Your code is nice too but since I use the "poedit" language management system, the Initialization procedure are little bit different than the one given here. Anyway there are so many ways to write a source code there may be a programmer on the planet and probably beyond ! :wink:

For example, a simple way to get Day and Month names :

Code: Select all

Procedure.s DayName(DayID, LanguageID = 0, DayList.s = "")
  
  Select LanguageID
      
    Case 0
      DayName.s = StringField("Dimanche;Lundi;Mardi;Mercredi;Jeudi;Vendredi;Samedi", DayID+1, ";")
      
    Case 1
      DayName.s = StringField("Sunday;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday", DayID+1, ";")
      
    Default 
      DayName.s = StringField(DayList, DayID+1, ";")
      
  EndSelect
  
  ProcedureReturn DayName
EndProcedure 


Procedure.s MonthName(MonthID, LanguageID = 0, MonthList.s = "")
  
  Select LanguageID
      
    Case 0
      MonthName.s = StringField("Janvier;Février;Mars;Avril;Mai;Juin;Juillet;Août;Septembre;Octobre;Novembre;Décembre", MonthID, ";")
      
    Case 1
      MonthName.s = StringField("January;February;March;April;May;June;July;August;September;October;November;December", MonthID, ";")
      
    Default 
      MonthName.s = StringField(MonthList, MonthID, ";")
      
  EndSelect
  
  ProcedureReturn MonthName
EndProcedure
But of course some way to do are better than others, but which one ? It's, indeed, a very good question !

Regards
StarBootics
The Stone Age did not end due to a shortage of stones !
Post Reply