返回两个日期之间的天数(年月日)
(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]