明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1099|回复: 7

[讨论] 如何得到两个日期相减的天数

[复制链接]
发表于 2014-12-6 21:09:06 | 显示全部楼层 |阅读模式
如题,比如我想得到2014-2-22到2014-3-20之间的天数,有没有什么函数呢?感觉这个虽然貌似简单,但是实际想想还真不知道怎么做。
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-12-6 21:42:01 | 显示全部楼层
此类问题,找度娘就可以了!
我的这个贴子里也有日期的算法,可以去参考一下:
【Gu_xl】原创程序:DIY日历程序【源码】
发表于 2014-12-6 21:53:10 | 显示全部楼层
 楼主| 发表于 2014-12-6 21:55:56 | 显示全部楼层
Gu_xl 发表于 2014-12-6 21:42
此类问题,找度娘就可以了!
我的这个贴子里也有日期的算法,可以去参考一下:
【Gu_xl】原创程序:DIY日 ...

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

点评

你换几十上百摆着,用不完的  发表于 2014-12-6 22:07
 楼主| 发表于 2014-12-6 22:14:52 | 显示全部楼层
wzg356 发表于 2014-12-6 21:53
http://www.mjtd.com/function/info-129-413.html

谢谢,我试试
发表于 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)
发表于 2022-8-1 21:49:03 | 显示全部楼层
如果你不嫌弃vbs+LISP的话,可以用下面方式简单获取:


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

发表于 2022-8-3 23:41:17 | 显示全部楼层
本帖最后由 highflybird 于 2022-8-3 23:53 编辑

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

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-9-29 21:25 , Processed in 0.217782 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表