UnderwareDESIGN

PlayBASIC => Resources => Source Codes => Topic started by: kevin on May 28, 2008, 09:19:08 PM

Title: Convert / Get Numeric Date from Date
Post by: kevin on May 28, 2008, 09:19:08 PM
 This function converts a DATE string from the default format of Day Month Year (ie 10 May 2005) to  10,5,2005



[pbcode]


   Print GetNumericDate(currentdate$())
   Print GetNumericDate("10/jan/2007")
   Print GetNumericDate("12/feb/2008")
   Print GetNumericDate("13/mar/2009")
   Print GetNumericDate("14/apr/2010")
   Print GetNumericDate("15/jun/2011")
   Print GetNumericDate("16/jul/2012")
   Print GetNumericDate("17/aug/2012")
   Print GetNumericDate("19/sep/2013")
   Print GetNumericDate("20/oct/2014")
   Print GetNumericDate("21/nov/2015")
   Print GetNumericDate("21/dec/2016")

   sync
   waitkey



// This function converts a dates format from eg 1 May 2000  to 1,5,2000

Function GetNumericDate(THisdate$)

   ListOFmonths$="Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"
   
   DIm _GetNumericDate$(3)

   Thisdate$=trim$(thisdate$," "+chr$(9))
   // replace delimiters chr's
   Thisdate$=replace$(thisdate$," ","/",1,false,false)
   Thisdate$=replace$(thisdate$,"/",",",1,false,false)

   // Split the feilds to an array
   if splittoarray(Thisdate$,",",_GetNumericDate$(),1)=3
      pos=INstring(lower$(listofmonths$),lower$(_GetNumericDate$(2)),1,false)
      Result$=_GetNumericDate$(1)+","+str$(((pos-1)/4)+1)+","+_GetNumericDate$(3)
   endif
   unDIm _GetNumericDate$()

EndFunction Result$

[/pbcode]
Title: Re: Convert / Get Numeric Date from Date
Post by: kevin on July 25, 2009, 09:53:22 PM
  This version converts a string containing a date, formatted as YYYY-MM-DD, to DD,MMM,YYYY



[pbcode]

   print MonthFormatDate("2000-1-30")
   print MonthFormatDate("2000-10-1")
   
   Sync
   waitkey
   
// This function converts a numeric dates formated as yyyy,mm,dd   to dd,mmm,yyyy  
// the month will be in 3 letter tag

Function MonthFormatDate(THisdate$)

   Dim _MonthNames$(12)
  ListOFmonths$="Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"
   count=SplitToArray(ListOfMonths$,",",_MonthNames$(),1)
   
   DIm _GetNumericDate$(3)

   // strip any pre/post spaces around the date
   Thisdate$=trim$(thisdate$," "+chr$(9))
   // replace delimiters chr's
   Thisdate$=replace$(thisdate$," ",",",1,false,false)
   Thisdate$=replace$(thisdate$,"/",",",1,false,false)
   Thisdate$=replace$(thisdate$,"-",",",1,false,false)

   // Split the feilds to an array
   if splittoarray(Thisdate$,",",_GetNumericDate$(),1)=3
      m=val(_GetNumericDate$(2))
      Result$=_GetNumericDate$(3)+","+_MonthNames$(m)
      Result$=Result$+","+_GetNumericDate$(1)
   endif
   unDIm _GetNumericDate$()

EndFunction Result$
[/pbcode]

Title: Re: Convert / Get Numeric Date from Date
Post by: kevin on July 27, 2009, 12:21:49 AM
 This example further expands upon the previous examples and add a function to convert a date formated DD,MMM,YEAR  (ie. 10,May,2003) to an approximate  time in history.  This is can useful for sorting information based upon date..


[pbcode]

   // Type to hold our dates
   Type tDates
         ThisDate$
         DayInHistory
   endType

   // Array to house our dates
   Dim Dates(0) as tDates


   // Add a bunch of the dates to the array so we've something to test    
   AddDate(currentdate$())
   AddDate("10/jan/2007")
   AddDate("12/feb/2008")
   AddDate("13/mar/2009")
   AddDate("14/apr/2010")
   AddDate("15/jun/2011")
   AddDate("16/jul/2012")
   AddDate("17/aug/2012")
   AddDate("19/sep/2013")
   AddDate("17/aug/1912")
   AddDate("20/oct/2014")
   AddDate("21/nov/2015")
   AddDate("21/dec/2016")

   // Display the dates
   print " Unsorted DATES"
   For lp=1 to GetArrayElements(Dates(),1)
      Print Dates(lp).ThisDate$  +"   "+Str$(Dates(lp).DayInHistory)
   Next


   // Display in order of OLDest to current
      Display_Dates_OldToNew()

   // Display them in backwards order
      Display_Dates_NewToOld()
      

   Sync
   waitkey
   


Function Display_Dates_OldToNew()
   print " Sorted Dates (Forwards)"
   max=   GetArrayElements(Dates(),1)
   Dim SortedMask(Max)
   For lp=1 to Max
      // Find Smallest
      DayInHistory=9999999
      DayInHistoryIndex=-1
      for Smallest=1 to Max
         If SortedMask(Smallest)=false
               if Dates(Smallest).DayInHistory<=DayInHistory
                  DayInHistoryIndex=Smallest
                  DayInHistory=Dates(Smallest).DayInHistory
               endif               
         endif
      next
      SortedMask(DayInHistoryIndex)=True
      Print Dates(DayInHistoryIndex).ThisDate$  +"   "+Str$(Dates(DayInHistoryIndex).DayInHistory)
   Next
EndFunction


Function Display_Dates_NewToOld()
   print " Sorted Dates (Backwards)"
   max=   GetArrayElements(Dates(),1)
   Dim SortedMask(Max)
   For lp=1 to Max
      // Find Smallest
      DayInHistory      =-99999
      DayInHistoryIndex   =-1
      for Largest=1 to Max
         If SortedMask(Largest)=false
               if Dates(Largest).DayInHistory>=DayInHistory
                  DayInHistoryIndex=Largest
                  DayInHistory=Dates(Largest).DayInHistory
               endif               
         endif
      next
      SortedMask(DayInHistoryIndex)=True
      Print Dates(DayInHistoryIndex).ThisDate$  +"   "+Str$(Dates(DayInHistoryIndex).DayInHistory)
   Next
EndFunction




Function AddDate(ThisDate$)
   index=GetFreeCell(dates())
   Dates(index).ThisDate$      =GetNumericDate(ThisDate$)   
   Dates(index).DayInHistory   =ConvertDateToDayInHistory(THisdate$)

EndFunction

// This function converts a dates format from eg 1 May 2000  to 1,5,2000

Function GetNumericDate(THisdate$)

  ListOFmonths$="Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"
   
   Dim _GetNumericDate$(3)

   Thisdate$=trim$(thisdate$," "+chr$(9))

   // replace delimiters chr's
   Thisdate$=replace$(thisdate$," ","/",1,false,false)
   Thisdate$=replace$(thisdate$,"/",",",1,false,false)

   // Split the feilds to an array
   if splittoarray(Thisdate$,",",_GetNumericDate$(),1)=3
      pos=INstring(lower$(listofmonths$),lower$(_GetNumericDate$(2)),1,false)
      Month$=str$(((pos-1)/4)+1)
      Result$=_GetNumericDate$(1)+","+Month$+","+_GetNumericDate$(3)
   endif
   unDIm _GetNumericDate$()

EndFunction Result$, DayInHistory


// This function converts a date format from eg 1 May 2000 to an appoximate day in history.  Useful for sorting

Function ConvertDateToDayInHistory(THisdate$)

  ListOFmonths$="Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"
   
   Dim _GetNumericDate$(3)

   Thisdate$=trim$(thisdate$," "+chr$(9))

   // replace delimiters chr's
   Thisdate$=replace$(thisdate$," ","/",1,false,false)
   Thisdate$=replace$(thisdate$,"/",",",1,false,false)

   // Split the feilds to an array
   if splittoarray(Thisdate$,",",_GetNumericDate$(),1)=3
      pos=INstring(lower$(listofmonths$),lower$(_GetNumericDate$(2)),1,false)
      Day$=_GetNumericDate$(1)
      Month$=str$(((pos-1)/4)+1)
      Year$=_GetNumericDate$(3)

      // To avoid havuing to worry about leap years and days per month,  here we just assume
      // that all months conatin 32 days.
      DaysPerMonth    =32
      DaysPerYear       = 12*DaysPerMonth

      // Conside this date into our Day In History
      DayInHistory=DaysPeryear   *Val(Year$)
      DayInHistory=DayInHistory   +(DaysPerMonth*Val(Month$))
      DayInHistory=DayInHistory   +(Val(Day$))

   endif
   unDIm _GetNumericDate$()

EndFunction DayInHistory

[/pbcode]  

 
Title: Re: Convert / Get Numeric Date from Date
Post by: kevin on March 27, 2014, 10:25:20 AM
 This is a slight variation of the function above, accept this one converts an input of format "DD MMM YYYY" (eg 20 May 2020) and converts it to YMD,   so 20 May 2020 would become 2020,05,20

I tend to use dates in this format for naming files, so the files system will sort those names in order

[pbcode]

   print CurrentDate$()
   print GetNumericDateYMA(CurrentDate$())
   Sync
   waitkey
   

Function GetNumericDateYMA(THisdate$)

   ListOFmonths$="Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"
   
   Dim _GetNumericDate$(3)

   Thisdate$=trim$(thisdate$," "+chr$(9))

   // replace delimiters chr's
   Thisdate$=replace$(thisdate$," ","/",1,false,false)
   Thisdate$=replace$(thisdate$,"/",",",1,false,false)

   // Split the feilds to an array
   if splittoarray(Thisdate$,",",_GetNumericDate$(),1)=3
      pos=INstring(lower$(listofmonths$),lower$(_GetNumericDate$(2)),1,false)
      Month$=digits$(((pos-1)/4)+1,2)
      Result$=_GetNumericDate$(3)+","+Month$+","+_GetNumericDate$(1)
   endif
   unDIm _GetNumericDate$()

EndFunction Result$

[/pbcode]