zoukankan      html  css  js  c++  java
  • 示例:日期运算

    (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)))

  • 相关阅读:
    力扣338. 比特位计数
    力扣22. 括号生成
    力扣46. 全排列
    力扣461. 汉明距离
    力扣617. 合并二叉树
    zabbix环境搭建部署(一)
    cacti,zabbix,nagios各自原理及区别
    两个硬盘对拷图解
    自动化运维之SaltStack实践
    nginx配置ssl证书
  • 原文地址:https://www.cnblogs.com/flowjacky/p/2824851.html
Copyright © 2011-2022 走看看