计算两个日期间隔天数
本帖最后由 tryhi 于 2019-6-19 12:10 编辑;;由给定的日期返回儒略日期(公元前4713)
;;(try-Date2Value 2016 4 11)
(defun try-Date2Value (Year Month Day / a_date b_date c_date e_date f_date juliandate)
(if (< Month 3)(setq Year(1- Year)Month(+ 12 Month)))
(setq
a_date (fix(/ Year 100.))
b_date (fix(/ a_date 4.));每4年1461天
c_date (- 2.0 (- a_date b_date))
e_date (fix(/ (* 1461. (+ Year 4716.0)) 4));多少个4年
f_date (fix(/ (* 153. (1+ Month)) 5.))
JulianDate (fix(+ c_date Day e_date f_date (- 1524)))
)
)
;;由儒略日期返回普通日期
;;(try-Value2Date 2457490);> '(25016 4 11)
(defun try-Value2Date (Value / _af _bf _cf _df _ef _ff _wf _xf _zf day month return year)
(if (> Value 0)
(setq
_zF (fix Value)
_wF (fix(/ (- _zF 1867216.25) 36524.25))
_xF (fix(/ _wF 4.))
_aF (+ _zF 1 _wF (- _xF))
_bF (+ _aF 1524.)
_cF (fix(/ (- _bF 122.1) 365.25))
_dF (fix(* 365.25 _cF))
_eF (fix(/ (- _bF _dF) 30.6001))
_fF (fix(* 30.6001 _eF))
Day (- _bF _dF _fF)
Month (if (< (1- _eF)13)(1- _eF)(- _eF 13))
Year (if(< Month 3)(- _cF 4715)(- _cF 4716))
Return (list (fix Year)(fix Month)(fix Day))
)
)
)
;;返回两个日期的间隔天数
;(try-Date-number '(2016 2 30)'(2016 4 8))
(defun try-Date-dist (a b)
(apply '-(mapcar '(lambda(x)(apply 'try-Date2Value x))(list b a)))
)
try-Date2Value 由给定的日期返回儒略日期(公元前4713)
try-Value2Date 由儒略日期返回普通日期
try-Date-dist 返回两个日期的间隔天数
从AU3自带的扩展函数里面看到的,转为lsp代码给大家,附件跟原文是一样的内容
'(2016 2 30),2016年2月30日:L Carter丶Bo 发表于 2021-10-22 13:38
'(2016 2 30),2016年2月30日
什么情况下返回2月30 不是返回2月30日,是
;;返回两个日期的间隔天数
;(try-Date-number '(2016 2 30)'(2016 4 8))
你举例写的 '(2016 2 30),不会返回2016年2月30日:lol 原来是举例不恰当,这个问题不大 有个保留函数 ymd->fix可以解决这个问题 本帖最后由 yanhongguang202 于 2022-8-1 19:07 编辑
删了,我的好啰嗦,还是海神的好 很实用, baitang36 发表于 2022-7-15 15:15
有个保留函数 ymd->fix可以解决这个问题
不知道怎么用,
(- (ymd->fix 2023 4 30) (ymd->fix 2022 4 30))
返回372,似乎不太对,应该是365吧 tryhi 发表于 2023-5-18 17:46
不知道怎么用,
(- (ymd->fix 2023 4 30) (ymd->fix 2022 4 30))
ymd->fix从公元0年1月1号开计数,默认每月都是31天,所以仅仅是个有限准确,不跨月的解决方案
页:
[1]
2