Date manipulation: Difference between revisions

Content deleted Content added
Rob-codes (talk | contribs)
m re-ordered part of code
Rob-codes (talk | contribs)
improved variable names, added comments, added second example
Line 1,043:
<syntaxhighlight lang="lisp">
 
(defun fix-time-string (badcalendar-string)
"If BADCALENDAR-STRING has no space between time and am/a.m./pm/p.m., add a space."
Return string with space between time and am/a.m./pm/p.m."
(replace-regexp-in-string "\\([[:digit:]]\\)\\([ap]\\)" "\\1 \\2" badcalendar-string))
 
(defun is-pm (time-ascalendar-string)
"Test if TIME-ASCALENDAR-STRING has PM/pm/P.M/p.m in it."
(string-match-p "[Pp][.]?[Mm]" time-ascalendar-string))
 
(defun is-hour-1-to-11 (a-timecalendar-stamplist)
"Test if hour in A-TIMECALENDAR-STAMPLIST is between 1 and 11."
(let ((hour-value))
(setq hour-value (nth 2 a-timecalendar-stamplist))
(and (>= hour-value 1) (<= hour-value 11))))
 
(defun adjust-if-pm (time-as-string)
"If TIME-AS-STRING includes pm/PM, and hour is 1 to 11, add 12 hours."
Return CALENDAR-LIST modified if date is pm and hour is 1-11; otherwise
(let ((temp-time-stamp))
return CALENDAR-LIST of original TIME-AS-STRING."
(setq temp-time-stamp (parse-time-string time-as-string))
(let ((calendar-list))
(if (and (is-pm time-as-string) (is-hour-1-to-11 temp-time-stamp))
(setq calendar-list (decodedparse-time-addstring temp-time-stamp (makeas-decoded-time :hour 12string))
(if (and temp(is-pm time-stampas-string) (is-hour-1-to-11 calendar-list))
(decoded-time-add calendar-list (make-decoded-time :hour 12))
calendar-list)))
 
(defun add-hours (startcalendar-time-stamplist number-of-hours)
"Add NUMBER-OF-HOURS to STARTCALENDAR-TIME-STAMPLIST."
(decoded-time-add startcalendar-time-stamplist (make-decoded-time :hour number-of-hours)))
 
(defun calc-future-time (string-calendar-date number-of-hours-in-future)
"Calculate future time by adding NUMBER-OF-HOURS-IN-FUTURE to STRING-CALENDAR-DATE ."
(let ((fixed-calendar-string)
(24-hour-calendar-stringlist)
(decodedcalendar-list-future-time)
(coded-future-time))
(setq fixed-calendar-string (fix-time-string string-calendar-date))
(setq 24-hour-calendar-stringlist (adjust-if-pm fixed-calendar-string))
(setq decodedcalendar-list-future-time (add-hours 24-hour-calendar-stringlist number-of-hours-in-future))
(setq coded-future-time (encode-time decodedcalendar-list-future-time))
(format-time-string "%B %e %Y %R %p %Z" coded-future-time)))
 
Line 1,089 ⟶ 1,092:
"March 8 2009 08:30 AM EDT"
</pre>
 
And a second solution, which modifies the ELisp timestamp to calculate 12 hours in the future
<syntaxhighlight lang="lisp">
 
(defun fix-time-string (calendar-string)
"If CALENDAR-STRING has no space between time and a.m./p.m., add a space."
(replace-regexp-in-string "\\([[:digit:]]\\)\\([ap]\\)" "\\1 \\2" calendar-string))
 
(defun is-pm (calendar-string)
"Test if CALENDAR-STRING has PM/pm in it."
(string-match-p "[Pp][Mm]" time-as-string))
 
(defun is-hour-1-to-11 (a-calendar-list)
"Test if hour in A-CALENDAR-LIST is between 1 and 11."
(let ((hour-value))
(setq hour-value (nth 2 a-calendar-list))
(and (>= hour-value 1) (<= hour-value 11))))
 
(defun adjust-if-pm (time-as-string)
"If TIME-AS-STRING includes pm/PM, and hour is 1 to 11, add 12 hours.
Return time as integer of seconds past the epoch."
(let ((calendar-list)
(let ( (temp-time-stamp))
(time-stamp-as-integer))
(setq temp-timecalendar-stamplist (parse-time-string time-as-string))
(setq temp-time-stamp (encode-time calendar-list))
(setq time-stamp-as-integer (time-convert temp-time-stamp 'integer))
(if (and (is-pm time-as-string) (is-hour-1-to-11 tempcalendar-time-stamplist))
(+ time-stamp-as-integer (* 12 60 60)) ; return time + 12 hours, so that hour is 13-23
time-stamp-as-integer))) ; return time unchanged, leaving hour 0-12
 
(defun add-seconds (start-time-stamp-integer number-of-seconds)
"Add NUMBER-OF-HOURS to START-TIME-STAMP-INTEGER."
(+ start-time-stamp-integer number-of-seconds))
 
(defun calc-future-time (string-calendar-date number-of-seconds-in-future)
"Calculate future time by adding NUMBER-OF-SECONDS-IN-FUTURE to STRING-CALENDAR-DATE ."
(let ((fixed-calendar-string)
(time-stamp-as-integer)
(coded-current-time)
(future-time-as-integer))
(setq fixed-calendar-string (fix-time-string string-calendar-date))
(setq time-stamp-as-integer (adjust-if-pm fixed-calendar-string))
(setq future-time-as-integer (add-seconds time-stamp-as-integer number-of-seconds-in-future))
(format-time-string "%B %e %Y %R %p %Z" future-time-as-integer)))
 
</syntaxhighlight>
 
{{out}}
(calc-future-time "March 7 2009 7:30pm EST" (* 12 60 60))
 
<pre>
"March 8 2009 08:30 AM EDT"
</pre>
 
 
 
=={{header|Erlang}}==