(defun as-string (x)
(format nil "~a" x))
;;;;日期转化
;支持对象(按交易日):
; M-1,M1,M2,M3...MN
; W-1,W1,W2,W3...WN
;按交易日处理;日期表示每月第N个交易日或每周第N个交易日
;负数表示倒数
(defun cvt-to-date (x)
(labels ((offset (d)
(cond
((null d) 0)
((= d 0) 0)
((> d 0) (1- d))
((< d 0) (1+ d)))))
(let* ((s (as-string x))
(s0 (elt s 0))
(ds (parse-integer (subseq s 1) :junk-allowed t)))
(as-string
(cond
((null ds) "00000000")
((char-equal s0 #\W)
(whj.calendar:GET-NEXT-DATE
(if (>= ds 0)
(WHJ.CALENDAR:GET-WEEK-FIRST-DATE *today* T)
(WHJ.CALENDAR:GET-WEEK-LAST-DATE *today* T))
(offset ds)
:T-P T))
((char-equal s0 #\M)
(whj.calendar:GET-NEXT-DATE
(if (>= ds 0)
(WHJ.CALENDAR:GET-MONTH-FIRST-DATE *today* T)
(WHJ.CALENDAR:GET-MONTH-LAST-DATE *today* T))
(offset ds)
:T-P T))
(t
"00000000"))))))
判定方法:
(member (as-string *today*) (mapcar #'cvt-to-date date-list) :test #'string=)