tryhi 发表于 2019-6-19 12:08:33

计算两个日期间隔天数

本帖最后由 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代码给大家,附件跟原文是一样的内容

Carter丶Bo 发表于 2021-10-22 13:38:56

'(2016 2 30),2016年2月30日:L

tryhi 发表于 2021-10-22 15:46:26

Carter丶Bo 发表于 2021-10-22 13:38
'(2016 2 30),2016年2月30日

什么情况下返回2月30

Carter丶Bo 发表于 2021-10-25 15:04:34

不是返回2月30日,是
;;返回两个日期的间隔天数
;(try-Date-number '(2016 2 30)'(2016 4 8))
你举例写的 '(2016 2 30),不会返回2016年2月30日:lol

tryhi 发表于 2021-10-25 16:10:36

原来是举例不恰当,这个问题不大

baitang36 发表于 2022-7-15 15:15:52

有个保留函数 ymd->fix可以解决这个问题

yanhongguang202 发表于 2022-8-1 19:03:36

本帖最后由 yanhongguang202 于 2022-8-1 19:07 编辑

删了,我的好啰嗦,还是海神的好

wosiguwozai0830 发表于 2022-9-1 16:02:56

很实用,

tryhi 发表于 2023-5-18 17:46:52

baitang36 发表于 2022-7-15 15:15
有个保留函数 ymd->fix可以解决这个问题

不知道怎么用,
(- (ymd->fix 2023 4 30) (ymd->fix 2022 4 30))

返回372,似乎不太对,应该是365吧

kozmosovia 发表于 2023-5-18 22:30:33

tryhi 发表于 2023-5-18 17:46
不知道怎么用,
(- (ymd->fix 2023 4 30) (ymd->fix 2022 4 30))



ymd->fix从公元0年1月1号开计数,默认每月都是31天,所以仅仅是个有限准确,不跨月的解决方案
页: [1] 2
查看完整版本: 计算两个日期间隔天数