明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3035|回复: 9

LISP计算时间差

[复制链接]
发表于 2012-7-1 15:24:17 | 显示全部楼层 |阅读模式
各位好,请问LISP如何计算时间差,我的日期为字符串,计算两日期间的天数要如何写LISP代码?
发表于 2012-7-1 15:56:51 | 显示全部楼层
Command: (- (distof "20120702") (distof "20120701"))
1.0

Command: (- (atoi "20120702") (atoi "20120701"))
1
发表于 2012-7-1 16:17:13 | 显示全部楼层
  1. ;;;返回指定年份的总天数
  2. (defun dt-dates        (oneyear)
  3.   (if (numberp oneyear)
  4.     (if        (= 0 (rem oneyear 4))
  5.       (if (= 0 (rem oneyear 100))
  6.         (if (= 0 (rem oneyear 400))
  7.           366
  8.           365
  9.         )
  10.         366
  11.       )
  12.       365
  13.     )
  14.   )
  15. )
  16. ;;;返回指定年份每个月和对应的天数的关联表
  17. (defun dt-everyMonth-list (spacYear)
  18.   (list
  19.     (cons 1 31)
  20.     (cons 2
  21.           (if (= 0 (rem spacYear 4))
  22.             (if        (= 0 (rem spacYear 100))
  23.               (if (= 0 (rem spacYear 400))
  24.                 29
  25.                 28
  26.               )
  27.               29
  28.             )
  29.             28
  30.           )
  31.     )
  32.     (cons 3 31)
  33.     (cons 4 30)
  34.     (cons 5 31)
  35.     (cons 6 30)
  36.     (cons 7 31)
  37.     (cons 8 31)
  38.     (cons 9 30)
  39.     (cons 10 31)
  40.     (cons 11 30)
  41.     (cons 12 31)
  42.   )
  43. )
  44. ;;;返回指定日期是当年的第几天
  45. ;;;spyear  指定年份
  46. ;;;spmonth 指定月份
  47. ;;;spdate  指定日期
  48. (defun dt-nthdate (spyear spmonth spdate / ddList somemon sumdates)
  49.   (if (and (numberp spyear) (numberp spmonth) (numberp spdate))
  50.     (progn
  51.       (setq ddList   (dt-everyMonth-list spyear)
  52.             somemon  1
  53.             sumdates 0
  54.       )
  55.       (while (< somemon spmonth)
  56.         (setq sumdates (+ (cdr (assoc somemon ddList)) sumdates)
  57.               somemon  (1+ somemon)
  58.         )
  59.       )
  60.       (+ sumdates spdate)
  61.     )
  62.   )
  63. )
  64. ;;;两个日期之间的天数
  65. (defun dt-dist (mList nList / maxyear minyear maxList minList someyear
  66.                 sumdate)
  67.   (if (and (numberp (caddr mList)) (numberp (caddr nList)))
  68.     (if        (/= (car mList) (car nList))
  69.       (progn
  70.         (setq maxyear (max (car mList) (car nList))
  71.               minyear (min (car mList) (car nList))
  72.               maxList (assoc maxyear (list mList nList))
  73.               minList (assoc minyear (list mList nList))
  74.         )
  75.         (setq someyear (+ minyear 1)
  76.               sumdate  0
  77.         )
  78.         (while (< someyear maxyear)
  79.           (setq        sumdate         (+ (dt-dates someyear) sumdate)
  80.                 someyear (1+ someyear)
  81.           )
  82.         )
  83.         (+ (- (dt-dates minyear)
  84.               (dt-nthdate minyear (cadr minList) (caddr minList))
  85.            )
  86.            sumdate
  87.            (dt-nthdate maxyear (cadr maxList) (caddr maxList))
  88.         )
  89.       )
  90.       (abs (- (dt-nthdate (car mList) (cadr mList) (caddr mList))
  91.               (dt-nthdate (car nList) (cadr nList) (caddr nList))
  92.            )
  93.       )
  94.     )
  95.   )
  96. )
 楼主| 发表于 2012-7-1 16:20:35 | 显示全部楼层
谢谢楼上的兄弟姐妹,太让我感动了
 楼主| 发表于 2012-7-1 16:24:00 | 显示全部楼层
Andyhon 发表于 2012-7-1 15:56
Command: (- (distof "20120702") (distof "20120701"))
1.0

老大,这法子好象只适用于当月的情况,不过还是谢谢
发表于 2012-7-1 16:40:51 | 显示全部楼层
...我的日期为字符串...

可否先来个示例?
Command: (Rtos (getVar "Cdate") 2 16)
"20120701.16370862"

Command: (Rtos (getVar "date") 2 16)
"2456110.692659502"
 楼主| 发表于 2012-7-1 18:32:38 | 显示全部楼层
Andyhon 发表于 2012-7-1 16:40
...我的日期为字符串...

可否先来个示例?

;;;将字符串转为列表,str字符串,del字符串的分隔符
(DEFUN stringtolist (str del / pos lst)
    (WHILE (SETQ pos (VL-STRING-SEARCH del str))
        (SETQ lst (CONS (SUBSTR str 1 pos) lst)
              str (SUBSTR str (+ pos 1 (STRLEN del)))
        )
    )
    (REVERSE (CONS str lst))
)
 楼主| 发表于 2012-7-1 18:37:53 | 显示全部楼层
本帖最后由 yeshuaxing 于 2012-7-1 18:39 编辑
Andyhon 发表于 2012-7-1 16:40
...我的日期为字符串...

可否先来个示例?



修改原代码
;;;两个日期之间的天数
(DEFUN dt-dist (mlist nlist / maxyear minyear maxlist minlist someyear
                sumdate
               );;;
;;;
;;;    (setq mlist "2003/11/1" nlist "2003/1/1")
    (SETQ mlist        (stringtolist mlist "/")
          nlist        (stringtolist nlist "/")
    )
    (SETQ mlist        (LIST (ATOI (CAR mlist))
                      (ATOI (CADR mlist))
                      (ATOI (CADDR mlist))
                )
    )
    (SETQ nlist        (LIST (ATOI (CAR nlist))
                      (ATOI (CADR nlist))
                      (ATOI (CADDR nlist))
                )
    );;;上为增加的代码
;;;;
(IF        (AND (NUMBERP (CADDR mlist)) (NUMBERP (CADDR nlist)))
        (IF (/= (CAR mlist) (CAR nlist))
            (PROGN
                (SETQ maxyear (MAX (CAR mlist) (CAR nlist))
                      minyear (MIN (CAR mlist) (CAR nlist))
                      maxlist (ASSOC maxyear (LIST mlist nlist))
                      minlist (ASSOC minyear (LIST mlist nlist))
                )
                (SETQ someyear (+ minyear 1)
                      sumdate  0
                )
...............................................................

;;;将日期如:“2012/07/01”转为列表,str字符串,del字符串的分隔符
(DEFUN stringtolist (str del / pos lst)
    (WHILE (SETQ pos (VL-STRING-SEARCH del str))
        (SETQ lst (CONS (SUBSTR str 1 pos) lst)
              str (SUBSTR str (+ pos 1 (STRLEN del)))
        )
    )
    (REVERSE (CONS str lst))
)

.................................

  应用举例: (dt-dist “2012/07/01”  “2011/1/1”)



发表于 2012-7-1 20:44:43 | 显示全部楼层
这儿有个 Julian date 的示例可一并参考
http://forums.autodesk.com/t5/Vi ... d-Time/td-p/2400622
 楼主| 发表于 2012-7-1 23:09:41 | 显示全部楼层
Andyhon 发表于 2012-7-1 20:44
这儿有个 Julian date 的示例可一并参考
http://forums.autodesk.com/t5/Visual-LISP-AutoLISP-and-Genera ...

谢谢Andyhon长老,你提供的代码可以解决问题了,再谢.....
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-18 20:50 , Processed in 0.341801 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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