admin 发表于 2024-4-7 09:23:46

返回两个日期之间的天数(年月日)

(K:LstDateDist
   (list 2024 01 05)
   (list 2024 01 08)
) ;-> 返回3


;返回两个(Lst)日期之间的天数,Lst = (list Year Moth Date)
(defun K:LstDateDist (Lst1 Lst2 / TolDay MaxLst MinLst i)
    (setq TolDay 0)
    (setq Lst1 (cons (car Lst1)(apply 'K:Date4Year Lst1))
          Lst2 (cons (car Lst2)(apply 'K:Date4Year Lst2))
    );重构表为:年份+当年日期的天数
    (if (eq (car Lst1) (car Lst2));年份相等
      (setq TolDay (abs (- (cdr Lst1) (cdr Lst2))));当年日期之差
      (progn
            (setq MaxLst (assoc (max (car Lst1) (car Lst2)) (list Lst1 Lst2))
                  MinLst (assoc (min (car Lst1) (car Lst2)) (list Lst1 Lst2))
            );找最大和最小
            (setq i 0 TolDay 0)
            (repeat (setq i (- (car MaxLst) (car MinLst)))
                (setq TolDay
                  (+TolDay
                        (if (K:IsLeapYear (+ (setq i (1- i)) (car MinLst))) 366 365);指定年份的天数
                  )
                )
            )
            (setq TolDay (+ TolDay (cdr MaxLst) (- (cdr MinLst))));加大减小
      )
    )
    TolDay
)


;判断指定年份(完整年份, 如2024年)是否为闰年
(defun K:IsLeapYear (Year)
(if (equal (rem Year 4.0) 0.0 0.00001)
      (if (equal (rem Year 100.0) 0.0 0.00001);测试整除100年的例外
          (if (equal (rem Year 400.0) 0.0 0.00001);测试整除400年的双重例外
            T   ;整除400是闰年
            nil ;整除100但不能整除400的年份为闰年
          )
          T ;整除4但不能整除100的年份为闰年
      )
      nil ;不能整除4的年份不是闰年
)
)
;返回指定日期是当年的第几天
(defun K:Date4Year (Year Moth Date / EvMothLst m d)
(if (and (numberp Year) (numberp Moth) (numberp Date))
      (progn
          (setq EvMothLst   
                (list
                  (cons 1 31)
                  (cons 2 (if (K:IsLeapYear Year) 29 28))
                  (cons 3 31)
                  (cons 4 30)
                  (cons 5 31)
                  (cons 6 30)
                  (cons 7 31)
                  (cons 8 31)
                  (cons 9 30)
                  (cons 10 31)
                  (cons 11 30)
                  (cons 12 31)
                )
          );指定年份每个月及天数的关联表
          (setq m 1 d 0)
          (while (< m Moth)
            (setq d (+ (cdr (assoc m EvMothLst)) d)
                  m(1+ m)
            )
          )
          (+ d Date)
      )
)
)




;格式化时间成列表(STR/Real)
      (defun K:Time2Lst (STR)
      (if (numberp STR) (setq STR (rtos STR 2 0)));Real/Int -> STR
      (mapcar
          'atoi
          (list
            (substr STR 1 4)
            (substr STR 5 2)
            (substr STR 7 2)
          )
      )
      )










页: [1]
查看完整版本: 返回两个日期之间的天数(年月日)