changyiran 发表于 2014-12-6 21:09:06

如何得到两个日期相减的天数

如题,比如我想得到2014-2-22到2014-3-20之间的天数,有没有什么函数呢?感觉这个虽然貌似简单,但是实际想想还真不知道怎么做。

Gu_xl 发表于 2014-12-6 21:42:01

此类问题,找度娘就可以了!
我的这个贴子里也有日期的算法,可以去参考一下:
【Gu_xl】原创程序:DIY日历程序【源码】

wzg356 发表于 2014-12-6 21:53:10

http://www.mjtd.com/function/info-129-413.html

changyiran 发表于 2014-12-6 21:55:56

Gu_xl 发表于 2014-12-6 21:42 static/image/common/back.gif
此类问题,找度娘就可以了!
我的这个贴子里也有日期的算法,可以去参考一下:
【Gu_xl】原创程序:DIY日 ...

G版,没明经币了,下载不了啊

changyiran 发表于 2014-12-6 22:14:52

wzg356 发表于 2014-12-6 21:53 static/image/common/back.gif
http://www.mjtd.com/function/info-129-413.html

谢谢,我试试

yanhongguang202 发表于 2022-8-1 19:08:09

;看了海神的,我这个好啰嗦
;计算两个任意日期之间的天数(不含起始两天),应按从小到大输入
(defun days-between-twodate(yearmonthdate1 yearmonthdate2 / year1 month1 date1 year2 month2 date2 lst_days_permonth1 lst_days_permonth2 days_cal days_ksjs n)
(setq year1 (atoi(substr(rtos yearmonthdate1 2 0) 1 4))
      month1 (atoi(substr(rtos yearmonthdate1 2 0) 5 2))
      date1 (atoi(substr(rtos yearmonthdate1 2 0) 7 2))
      )
(setq year2 (atoi(substr(rtos yearmonthdate2 2 0) 1 4))
      month2 (atoi(substr(rtos yearmonthdate2 2 0) 5 2))
      date2 (atoi(substr(rtos yearmonthdate2 2 0) 7 2))
      )
;每月天数
(setq lst_days_permonth1 (list 31 29 31 30 31 30 31 31 30 31 30 31));闰年每月天数
(setq lst_days_permonth2 (list 31 28 31 30 31 30 31 31 30 31 30 31));普通年每月天数

;;;判断某年共计有多少天数
(defun days-Is-leapyear-ronot(year / days)
    (if (or (and (= (rem year 100) 0) (= (rem year 4) 0)) (= (rem year 400) 0));闰年
      (setq days 366)
      (setq days 365)
      )
    days
    )
;(days-Is-leapyear-ronot 2022)

;;;判断某年某个日期在这年里过去了多少天(含最后一天)
(defun days-passed-inayear (year month date / sum i)
    (if (or (and (= (rem year 100) 0) (= (rem year 4) 0)) (= (rem year 400) 0));闰年
      (progn
      (setq sum 0)
      (setq i 0)
      (repeat (- month 1)
          (setq sum (+ sum (nth i lst_days_permonth1)))
          (setq i (1+ i))
          )
      (setq sum (+ sum date))
      )
      (progn
      (setq sum 0)
      (setq i 0)
      (repeat (- month 1)
          (setq sum (+ sum (nth i lst_days_permonth2)))
          (setq i (1+ i))
          )
      (setq sum (+ sum date))
      )
      )
    sum
    )
;(days-passed-inayear 2022 8 1)

;;;判断某年某个日期在这年里还剩多少天(不含起始一天,含最后一天)
(defun days-left-inayear (year month day / sum i)
    (if (or (and (= (rem year 100) 0) (= (rem year 4) 0)) (= (rem year 400) 0));闰年
      (progn
      (setq sum 0)
      (setq i 0)
      (repeat (- month 1)
          (setq sum (+ sum (nth i lst_days_permonth1)))
          (setq i (1+ i))
          )
      (setq left (- 366 sum day))
      )
      (progn
      (setq sum 0)
      (setq i 0)
      (repeat (- month 1)
          (setq sum (+ sum (nth i lst_days_permonth2)))
          (setq i (1+ i))
          )
      (setq left (- 365 sum day))
      )
      )
    left
    )
;(days-left-inayear 2022 8 1)

;;;计算同年中几个月之间的天数,这个思路同计算不同年之间的天数
(defun days-between-month-inayear(year month1 date1 month2 date2 / i sumdays)
    (if (or (and (= (rem year 100) 0) (= (rem year 4) 0)) (= (rem year 400) 0));闰年
      (cond
      ((= month1 month2) (setq sumdays (- date2 date1)))
      ((= (- month2 month1) 1) (setq sumdays (+ (- (nth (- month1 1) lst_days_permonth1) date1) date2)))
      ((> (- month2 month1) 1)
         (progn
         (setq sumdays (+ (- (nth (- month1 1) lst_days_permonth1) date1) date2))
         (setq i (+ month1 1))
         (repeat (- month2 month1 1)
             (setq sumdays (+ sumdays (nth (- i 1) lst_days_permonth1)))
             (setq i (1+ i))
             )
         )
         )
      )
      (cond
      ((= month1 month2) (setq sumdays (- date2 date1)))
      ((= (- month2 month1) 1) (setq sumdays (+ (- (nth (- month1 1) lst_days_permonth2) date1) date2)))
      ((> (- month2 month1) 1)
         (progn
         (setq sumdays (+ (- (nth (- month1 1) lst_days_permonth2) date1) date2))
         (setq i (+ month1 1))
         (repeat (- month2 month1 1)
             (setq sumdays (+ sumdays (nth (- i 1) lst_days_permonth2)))
             (setq i (1+ i))
             )
         )
         )
      )
      )
    sumdays
    )
;(days-between-month-inayear 2022 8 1 12 31)

;主要计算在此
(cond
    ((= year1 year2) (setq days_cal (days-between-month-inayear year1 month1 date1 month2 date2)));在同一年时
    ((= (- year2 year1) 1) (setq days_cal (+ (days-left-inayear year1 month1 date1) (days-passed-inayear year2 month2 date2))));跨了一年
    ((> (- year2 year1) 1);跨很多年
   (progn
       (setq days_ksjs (+ (days-left-inayear year1 month1 date1) (days-passed-inayear year2 month2 date2)))
       (setq days_cal 0)
       (setq n (+ year1 1))
       (repeat (- (- year2 year1) 1)
         (setq days_cal (+ days_cal (days-Is-leapyear-ronot n)))
         (setq n (1+ n))
         )
       (setq days_cal (+ days_cal days_ksjs))
       )
   )
    )
days_cal
)
;(days-between-twodate 20220801 20230101)

highflybird 发表于 2022-8-1 21:49:03

如果你不嫌弃vbs+LISP的话,可以用下面方式简单获取:



(or
    (setq wcs (vlax-create-object "Aec32BitAppServer.AecScriptControl.1"))
    (setq wcs (vlax-create-object "ScriptControl"))
)
(vlax-put-property wcs "language" "VBScript")
(setq        code "Function GetDays(t1,t2)\nGetDays = DateDiff(\"d\",t1,t2)\nEnd Function")
(vlax-invoke wcs 'addcode code)
(princ (vlax-invoke wcs 'run "GetDays" "1949-10-01" "2022-08-01"));此处输入两个要求的日期

highflybird 发表于 2022-8-3 23:41:17

本帖最后由 highflybird 于 2022-8-3 23:53 编辑

此回复已经删除,经核算,原回复提供函数不可靠。

页: [1]
查看完整版本: 如何得到两个日期相减的天数