明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8077|回复: 47

[函数] 【TB原创】AutoCAD系统变量Date与CDate日期格式相互转化

  [复制链接]
发表于 2014-12-18 11:09 | 显示全部楼层 |阅读模式
本帖最后由 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

评分

参与人数 1明经币 +2 收起 理由
Gu_xl + 2 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2018-11-18 14:58 | 显示全部楼层
借来用用,谢谢了,楼主
发表于 2018-8-26 13:26 | 显示全部楼层
强啊,想了好久没想到。。。。
发表于 2018-8-26 14:45 | 显示全部楼层
时间转化 来学习下
发表于 2016-6-1 20:46 | 显示全部楼层
谢谢楼主分享。。。
发表于 2016-6-1 20:45 | 显示全部楼层
谢谢楼主分享
发表于 2016-5-31 14:36 | 显示全部楼层
查看fghjyughdryjureyju
发表于 2016-4-24 14:37 | 显示全部楼层
学习学习,谢谢分享
发表于 2016-2-18 20:36 | 显示全部楼层
源码支持,多谢!
发表于 2015-10-10 09:06 | 显示全部楼层
非常详细,感谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 17:20 , Processed in 0.647987 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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