找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 267|回复: 0

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

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-4-7 09:23:46 | 显示全部楼层 |阅读模式
  1. (K:LstDateDist
  2.      (list 2024 01 05)
  3.      (list 2024 01 08)
  4. ) ;-> 返回3
  5. ;返回两个(Lst)日期之间的天数,Lst = (list Year Moth Date)
  6. (defun K:LstDateDist (Lst1 Lst2 / TolDay MaxLst MinLst i)
  7.     (setq TolDay 0)
  8.     (setq Lst1 (cons (car Lst1)(apply 'K:Date4Year Lst1))
  9.           Lst2 (cons (car Lst2)(apply 'K:Date4Year Lst2))
  10.     );重构表为:年份+当年日期的天数
  11.     (if (eq (car Lst1) (car Lst2));年份相等
  12.         (setq TolDay (abs (- (cdr Lst1) (cdr Lst2))));当年日期之差
  13.         (progn
  14.             (setq MaxLst (assoc (max (car Lst1) (car Lst2)) (list Lst1 Lst2))
  15.                   MinLst (assoc (min (car Lst1) (car Lst2)) (list Lst1 Lst2))  
  16.             );找最大和最小
  17.             (setq i 0 TolDay 0)
  18.             (repeat (setq i (- (car MaxLst) (car MinLst)))
  19.                 (setq TolDay
  20.                     (+  TolDay
  21.                         (if (K:IsLeapYear (+ (setq i (1- i)) (car MinLst))) 366 365);指定年份的天数
  22.                     )
  23.                 )
  24.             )
  25.             (setq TolDay (+ TolDay (cdr MaxLst) (- (cdr MinLst))));加大减小
  26.         )
  27.     )
  28.     TolDay
  29. )
  30. ;判断指定年份(完整年份, 如2024年)是否为闰年
  31. (defun K:IsLeapYear (Year)
  32.   (if (equal (rem Year 4.0) 0.0 0.00001)
  33.       (if (equal (rem Year 100.0) 0.0 0.00001);测试整除100年的例外
  34.           (if (equal (rem Year 400.0) 0.0 0.00001);测试整除400年的双重例外
  35.               T   ;整除400是闰年
  36.               nil ;整除100但不能整除400的年份为闰年
  37.           )
  38.           T ;整除4但不能整除100的年份为闰年
  39.       )
  40.       nil ;不能整除4的年份不是闰年
  41.   )
  42. )
  43. ;返回指定日期是当年的第几天
  44. (defun K:Date4Year (Year Moth Date / EvMothLst m d)
  45.   (if (and (numberp Year) (numberp Moth) (numberp Date))
  46.       (progn
  47.           (setq EvMothLst   
  48.                 (list
  49.                   (cons 1 31)
  50.                   (cons 2 (if (K:IsLeapYear Year) 29 28))
  51.                   (cons 3 31)
  52.                   (cons 4 30)
  53.                   (cons 5 31)
  54.                   (cons 6 30)
  55.                   (cons 7 31)
  56.                   (cons 8 31)
  57.                   (cons 9 30)
  58.                   (cons 10 31)
  59.                   (cons 11 30)
  60.                   (cons 12 31)
  61.                 )
  62.           );指定年份每个月及天数的关联表
  63.           (setq m 1 d 0)
  64.           (while (< m Moth)
  65.               (setq d (+ (cdr (assoc m EvMothLst)) d)
  66.                     m  (1+ m)
  67.               )
  68.           )
  69.           (+ d Date)
  70.       )
  71.   )
  72. )
  73. ;格式化时间成列表(STR/Real)
  74.       (defun K:Time2Lst (STR)
  75.         (if (numberp STR) (setq STR (rtos STR 2 0)));Real/Int -> STR
  76.         (mapcar
  77.           'atoi
  78.           (list
  79.             (substr STR 1 4)
  80.             (substr STR 5 2)
  81.             (substr STR 7 2)
  82.           )
  83.         )
  84.       )
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 17:52 , Processed in 0.093926 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表