如何得到两个日期相减的天数
如题,比如我想得到2014-2-22到2014-3-20之间的天数,有没有什么函数呢?感觉这个虽然貌似简单,但是实际想想还真不知道怎么做。此类问题,找度娘就可以了!
我的这个贴子里也有日期的算法,可以去参考一下:
【Gu_xl】原创程序:DIY日历程序【源码】 http://www.mjtd.com/function/info-129-413.html Gu_xl 发表于 2014-12-6 21:42 static/image/common/back.gif
此类问题,找度娘就可以了!
我的这个贴子里也有日期的算法,可以去参考一下:
【Gu_xl】原创程序:DIY日 ...
G版,没明经币了,下载不了啊 wzg356 发表于 2014-12-6 21:53 static/image/common/back.gif
http://www.mjtd.com/function/info-129-413.html
谢谢,我试试 ;看了海神的,我这个好啰嗦
;计算两个任意日期之间的天数(不含起始两天),应按从小到大输入
(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)
如果你不嫌弃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:53 编辑
此回复已经删除,经核算,原回复提供函数不可靠。
页:
[1]