Date Words

Mark Smith marksmithhfx at gmail.com
Wed Jun 12 16:36:25 EDT 2024


Hi Bob,

I love the concept in principle but that’s a lot of code (to write and debug) and it does’t cover every possible permutation and combination of date requests. I long for a time when we can just capture a string like “a week from next Friday” and then call…

 function string2gptDate
     chatGPT “what is the date “ & “a week from next Friday” -- the latter being the captured input, probably expressed as a field or var
     return it
end string2gptDate

Which I just tried after prompting “when asked for a date please return the date and not an explanation as to how you arrived at the date” and in response to the above it returned "June 28, 2024”.

Magnifico!

Mark 

> On 12 Jun 2024, at 4:20 PM, Bob Sneidar via use-livecode <use-livecode at lists.runrev.com> wrote:
> 
> Hi all. 
> 
> Did you ever want to use phrases like yesterday, last tuesday or next friday in a date field? 
> 
> function dateWords pDate
>   if word 1 of pDate is not among the items of "last,next,yesterday,today,tomorrow" then \
>         return empty
> 
>   put date() into tCurrentDate
>   convert tCurrentDate to dateItems
> 
>   if the number of words of pDate = 2 then
>      put "sunday,monday,tuesday,wednesday,thursday,friday,saturday" into tDaysOfWeek
>      put itemOffset(word 2 of pDate, tDaysOfWeek) into tDayNumber
>      put item 7 of tCurrentDate into tThisDayNumber
> 
>      if tDayNumber = 0 then \
>            return empty
>   end if
> 
>   switch
>      case word 1 of pDate is "last"
>         if tDayNumber >= tThisDayNumber then \
>               subtract 7 from item 3 of tCurrentDate
>         add (tDayNumber - tThisDayNumber) to item 3 of tCurrentDate
>         break
>      case word 1 of pDate is "next"
>         add 7-tDayNumber to item 3 of tCurrentDate
>         break
>      case pDate is "yesterday"
>         subtract 1 from item 3 of tCurrentDate
>         break
>      case pDate is "today"
>         -- don't do anything
>         break
>      case pDate is "tomorrow"
>         add 1 to item 3 of tCurrentDate
>         break
>   end switch
> 
>   put formatDate(tCurrentDate, "standard") into pDate
>   return pDate
> end dateWords
> 
> FUNCTION formatDate theDate, theFormat
>   /*
>   Accepts any valid date for the first parameter. If not a valid date, it simply returns
>   what was passed. Second parameter can be any of the following:
>   sql date: date in the yyyy-mm-dd format
>   short date, abbreviated date, internet date, long date: LC versions of the same
>   julian date: Julian number based on (I believe) Jacques formula
>   standard date: The date in the form of "mm/dd/yyyy"
>   */
> 
>   put theDate into tSavedDate
>   put the itemdelimiter into theOldDelim
>   set the itemdelimiter to "-"
> 
>   IF the length of item 1 of theDate = 4 AND \
>         the number of items of theDate = 3 AND \
>         item 1 of theDate is a number AND \
>         item 2 of theDate is a number AND \
>         item 3 of theDate is a number THEN
>      put item 2 of theDate & "/" & \
>            item 3 of theDate & "/" & \
>            item 1 of theDate into theDate
>   END IF
> 
>   -- replace "." with "/" in theDate
>   convert theDate to dateitems
>   set the itemdelimiter to theOldDelim
> 
>   --   if the number of items of theDate <> 7 then
>   --      answer "'" & theDate & "' is not a valid date format!"
>   --      return tSavedDate
>   --   end if
> 
>   SWITCH word 1 of theFormat
>      CASE "sql"
>         /*
>         put item 1 of theDate & "-" & \
>               format("%02d",item 2 of theDate) & "-" & \
>               format("%02d",item 3 of theDate) into theDate
>         */
>         put format("%s-%02d-%02d", item 1 of theDate, item 2 of theDate, \
>               item 3 of theDate) into theDate
>         break
>      CASE "short"
>         convert theDate from dateitems to short date
>         break
>      CASE "abbreviated"
>         convert theDate from dateitems to abbreviated date
>         break
>      CASE "abbr"
>         convert theDate from dateitems to abbreviated date
>         break
>      CASE "internet"
>         convert theDate from dateitems to internet date
>         break
>      CASE "long"
>         convert theDate from dateitems to long date
>         break
>      CASE "julian"
>         put the date into theDate
>         convert theDate to dateItems
>         IF  ((item 2 of theDate = 1) OR (item 2 of theDate = 2)) THEN
>            put 1 into theDay
>         ELSE
>            put 0 into theDay
>         END IF
>         put item 1 of theDate + 4800 - theDay into theYear
>         put item 2 of theDate + (12 * theDay) - 3 into theMonth
>         put item 3 of theDate + \
>               ((153 * theMonth + 2) div 5) + \
>               (365 * theYear) + \
>               (theYear div 4) - \
>               (theYear div 100) + \
>               (theYear div 400) - \
>               32045 into theDate
>         break
>      case "standard"
>         put format("%02d/%02d/%04d", item 2 of theDate, item 3 of theDate, \
>               item 1 of theDate) into theDate
>         break
>      default 
>         --         answer info "'" & theFormat & "' is not a valid parameter." As sheet
>         put tSavedDate into theDate
>   END SWITCH
> 
>   return theDate
> END formatDate
> 
> Bob S
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode



More information about the use-livecode mailing list