- 积分
- 25715
- 明经币
- 个
- 注册时间
- 2007-3-1
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 tengte 于 2014-12-19 12:28 编辑
LISP函数中没有找到可将CDate格式的日期转化为Date格式的函数或方法,以方便计算两个日期相差的天数。
同时,对于输入的CDate格式的日期,也不能判断是否有效(如输入为20140229、20140132、20141301等)。
经过我的摸索,借助menucmd调用DIESEL的edtime,实现了两个日期格式转化的函数。
有这方面需求的朋友可以参考一下:
;时间格式转化:Date转化为CDate
(defun Date->CDate (date / s)
(setq s (strcat "M=$(edtime," (rtos date 2 8) ",YYYYMODD.HHMMSS)"))
(atof (menucmd s))
) ;defun
;--------------------------------------------------------------------------------------------------------------------------------------
;感谢Gu_xl指出原函数中时间部分没转化的问题,现已修改,但转化后可能会有1秒的误差。
;另,我还有个《TB tools》的小工具,请参见:http://bbs.mjtd.com/thread-75530-1-1.html
; 《EPS(去除或添加AutoCAD教育版打印戳记)》,请参见:http://bbs.mjtd.com/thread-78256-1-1.html
;--------------------------------------------------------------------------------------------------------------------------------------
;时间格式转化:CDate转化为Date,无效日期返回nil
(defun CDate->Date (cdate / Round Time Diff cd dt i0 i n s)
(defun Round (x)
(if (>= x 0)
(fix (+ x 0.5))
(fix (- x 0.5))
) ;if
) ;defun
(defun Time (dt / x h m s)
(setq x (Round (rem (* dt 1E6) 1E6)))
(setq h (/ x 10000)
m (/ (rem x 10000) 100)
s (rem x 100)
)
(/ (+ (* 3600 h) (* 60 m) s) 8.64E4)
) ;defun
(defun Diff (cd1 cd2 / y1 y2 m1 m2 d1 d2 n)
(cond
((= cd1 cd2) (setq n 0))
((setq y1 (/ cd1 10000)
m1 (rem (/ cd1 100) 100)
d1 (rem cd1 100)
y2 (/ cd2 10000)
m2 (rem (/ cd2 100) 100)
d2 (rem cd2 100)
n (Round (+ (* 366 (- y1 y2)) (* 30.5 (- m1 m2)) (- d1 d2)))
)
(and (= n 0) (setq n nil))
)
) ;cond
n
) ;defun
(setq cd (fix cdate)
dt -47130101
i0 0
n 0
)
(while (and (setq i (Diff cd dt)) (/= i 0) (/= 0 (+ i i0)))
(setq n (+ n i)
s (strcat "M=$(edtime," (itoa n) ",YYYYMODD)")
dt (atoi (menucmd s))
i0 i
)
) ;while
(if (or (not i) (= 0 (+ i i0)))
(setq n nil)
) ;if
(and n (setq n (+ n (Time cdate))))
n
) ;defun
|
评分
-
查看全部评分
|