示例:日期运算

(defconstant month
                    #(0 31 59 90 120 151 181 212 243 273 304 334 365))

(defconstant yzero 2000)

(defun leap? (y)
    (and (zerop (mod y 4))
        (or (zerop (mod y 400))
            (not (zerop (mod y 100))))))

(defun date->num (d m y)
       (+ (- d 1) (month-num m y) (year-num y)))

(defun month-num (m y)
       (+ (svref month (- m 1))
          (if (and (> m 2) (leap? y)) 1 0)))

(defun year-num (y)
       (let ((d 0))
         (if (>= y yzero)
         (dotimes (i (- y yzero) d)
           (incf d (year-days (+ yzero i))))
         (dotimes (i (- yzero y) (- d))
           (incf d (year-days (+ y i)))))))

(defun year-days (y)
    (if (leap? y) 366 365))

(defun num->date (n)
       (multiple-value-bind (y left) (num-year n)
         (multiple-value-bind (m d) (num-month left y)
           (values d m y))))

(defun num-year (n)
       (if (< n 0)
           (do* ((y (- yzero 1) (- y 1))
             (d (- (year-days y)) (- d (year-days y))))
            ((<= d n) (values y (- n d))))
           (do* ((y yzero (+ y 1))
             (prev 0 d)
             (d (year-days y) (+ d (year-days y))))
            ((> d n) (values y (- n prev))))))

(defun num-month (n y)
       (if (leap? y)
           (cond ((= n 59) (values 2 29))
             ((> n 59) (nmon (- n 1)))
             (t (nmon n)))
           (nmon n)))

(defun nmon (n)
       (let ((m (position n month :test #' <)))
         (values m (+ 1 (- n (svref month (- m 1)))))))

(defun date+ (d m y n)
       (num->date (+ (date->num d m y) n)))

转载于:https://www.cnblogs.com/flowjacky/archive/2012/12/19/2824851.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值