明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 646|回复: 1

[函数] 搬运CAD扩展工具里的日期函数

[复制链接]
发表于 2022-10-14 15:54 | 显示全部楼层 |阅读模式
本帖最后由 dokey 于 2022-10-18 20:07 编辑

CAD扩展工具里几个有关日期转换的函数
;|
CTOJ  将日历日期和时间转换为公历日期;函数语法:(ctoj<年><月><日><小时><分><秒/分数>);
         输入:作为参数列表的日历日期;样例:(ctoj 1957 10 4 19 26 24);启动 Sputnik 1;返回:公历日期/分数,与 DATE 系统变量一样
DTOJ  将 AutoCAD 日历日期/时间转换为公历日期;函数语法:(dtoj<日历日期>);
         输入:实数 YYYYMMDD<.HHMMSSmsec>,类似于 CDATE setvar。返回:公历日期/分数,与 DATE 系统变量一样
JTOC  将公历日期转换为日历日期列表;函数语法:(jtoc<公历日期>);
         输入:实数<公历日期>。<分数>,类似于 DATE setvar;返回:日历日期/时间列表:(<年><月><日><小时><分><秒/分数>)
JTOD 将公历日期转换为 AutoCAD 日历日期/时间;函数语法:(jtod<公历日期>)
         输入:实数<公历日期>。<分数>,类似于 DATE setvar;返回:日历日期/时间,与 CDATEsystem 系统变量一样
JTOW  为给定的公历日期确定星期几;函数语法:(jtow<公历日期>);
          输入:实数<公历日期>。<分数>,类似于 DATE 系统变量;返回:整数星期几,0 = 星期日,1 = 星期一,6 = 星期六
|;

;;----------------------------------------------------------------------------

;;; (CTOJ <year> <month> <day> <hour> <minute> <second/fraction>)

(defun ctoj (yr m d hh mm ss / y a b)
    (setq y yr)

    (if (<= m 2)
        (setq y (1- y)
              m (+ m 12)
        )
    )

    (if (or (< yr 1582)
            (and (= yr 1582) (or (< m 10) (and (= m 10) (< d 5)))))
        (setq b 0)                    ; Julian calendar
        (setq a (fix (/ y 100))       ; Gregorian calendar
              b (+ (- 2 a) (fix (/ a 4)))
        )
    )

    (+ (fix (+ (* 365.25 (+ y 4716)) (fix (* 30.6001 (+ m 1)))))
         d b -1524.0 (/ (+ (* (+ (* hh 60) mm) 60) ss) (* 24.0 60 60)))
)

;;;----------------------------------------------------------------------------

;;; (DTOJ <calendar date>)  --  convert calendar date/time to Julian

(defun dtoj (cdate / c f yr ys m d)
    (setq ys (if (< cdate 0) -1 1)    ; Sign on year
          c (fix (abs cdate))         ; Date in unsigned digits
          yr (* (/ c 10000) ys)       ; Get year
          m (rem (/ c 100) 100)       ; Get month
          d (rem c 100)               ; Get day
          f (rem (abs cdate) 1)       ; Fraction of day
    )
    (ctoj yr m d (fix (+ (* f 100) 0.1))
                  (rem (fix (+ (* f 10000) 0.1)) 100)
                  (+ (rem (fix (+ (* f 1000000) 0.1)) 100)
                     (/ (rem (fix (+ (* f 1000000000) 0.1)) 1000) 1000.0)))
)

;;;----------------------------------------------------------------------------

;;; (JTOC <Julian date>)  --  convert Julian date/time to calendar date list

(defun jtoc (td / time a b c d e alpha z m hh mm)
    (setq time (* 86400.0 (- td (setq z (fix td)))))
    (if (< z 2299161)
        (setq a z)                                         ; Julian calendar
        (setq alpha (fix (/ (- z 1867216.25) 36524.25))    ; Gregorian calendar
              a (- (+ z 1 alpha) (fix (/ alpha 4)))
        )
    )

    (setq b (+ a 1524)
          c (fix (/ (- b 122.1) 365.25))
          d (fix (* 365.25 c))
          e (fix (/ (- b d) 30.6001))
    )

    (setq m (fix (if (< e 14) (1- e) (- e 13))))

    ; Determine the clock time from the fraction of a day

    (setq hh (fix (/ time 3600.0))
          time (- time (* hh 3600.0))
          mm (fix (/ time 60.0))
    )

    ; Return calendar date as list

    (list (fix (- c (if (> m 2) 4716 4715))) m (fix (- b d (fix (* 30.6001 e))))
          hh mm
          (- time (* mm 60))
    )
)

;;;----------------------------------------------------------------------------

;;; (JTOD <Julian date>)  --  convert Julian date/time to calendar

(defun jtod (td / j)
    (setq j (jtoc td))

    ; Return calendar date in form YYYYMMDD.HHMMSSmsec

    (* (+ (* (abs (car j)) 10000)     ; year
          (* (cadr j) 100)            ; month
          (caddr j)                   ; day
          (/ (cadddr j) 100.0)        ; hour
          (/ (nth 4 j) 10000.0)       ; minute
          (/ (nth 5 j) 1000000.0)     ; seconds, milliseconds
       )
       (if (< (car j) 0) -1 1)        ; apply sign to year
    )
)

;;;----------------------------------------------------------------------------

;;; (JTOW <Julian date>)  --  Convert a Julian date to day of week

(defun jtow (j)
    (fix (rem (1+ j) 7))
)



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2022-10-17 09:08 | 显示全部楼层
感谢分享好用的日期函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-28 05:07 , Processed in 0.193319 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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