dokey 发表于 2022-10-14 15:54:15

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

本帖最后由 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))
)



明_明 发表于 2022-10-17 09:08:47

感谢分享好用的日期函数
页: [1]
查看完整版本: 搬运CAD扩展工具里的日期函数