找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2598|回复: 23

[研讨] 给大家出个工程日期计算的题目

[复制链接]
发表于 2013-9-4 22:05:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1、最近做写东西,用到一个计算日期的东西,已知一个开工日期 “2013/9/3"   工期为N天 ,求竣工日期
这个东西在.NET里实现很简单
        Dim xtrq As Date = "2013/9/3"
        Dim st As Date = xtrq.AddDays(40)
两句话就可以求出来,想着这个要用LISP求就复杂一点了,要用纯数学计算的方式求得,废话不多说,高手们亮招吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-9-4 22:52:26 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-9-4 23:29 编辑

翻出来两个函数,时间太久忘记出处了
  1. ;;==================================
  2. ;;Convert Date to Julian
  3. (defun date->JD (yy mm dd / ggg jd s j1)
  4.   (if (<= yy 1585)
  5.     (setq ggg 0)
  6.     (setq ggg 1)
  7.   )
  8.   (setq jd (* -1 (/ (* 7 (+ (/ (+ mm 9) 12) yy)) 4)))
  9.   (if (< (- mm 9) 0)
  10.     (setq s -1)
  11.     (setq s 1)
  12.   )
  13.   (setq a  (abs (- mm 9))
  14. j1 (+ yy (* s (/ a 7)))
  15. j1 (* -1
  16.        (/ (* 3 (1+ (/ j1 100)))
  17.    4
  18.        )
  19.     )
  20. jd (+ jd (/ (* 275 mm) 9) dd (* ggg j1))
  21. jd (+ jd 1721027 (* 2 ggg) (* 367 yy))
  22.   )
  23.   jd
  24. )
  25. ;;Convert JuLian to Day
  26. (defun JD->Date (jd / l n i k j)
  27.   (setq l (+ jd 68569)
  28. n (/ (* 4 l) 146097)
  29. l (- l
  30.       (/ (+ 3 (* 146097 n)) 4)
  31.    )
  32. i (/ (* 4000 (1+ l)) 1461001)
  33. l (+ (- l (/ (* 1461 i) 4)) 31)
  34. j (/ (* 80 l) 2447)
  35. k (- l
  36.       (/ (* 2447 j) 80)
  37.    )
  38. l (/ j 11)
  39. j (- (+ j 2) (* 12 l))
  40. i (+ (* 100 (- n 49)) i l)
  41.   )
  42.   (atoi (strcat (itoa i)
  43.   (if (< j 10)
  44.     (strcat "0" (itoa j))
  45.     (itoa j)
  46.   )
  47.   (if (< k 10)
  48.     (strcat "0" (itoa k))
  49.     (itoa k)
  50.   )
  51. )
  52.   )
  53. )

_$ (date->JD 2013 1 20)
2456313
_$ (JD->date (+ 40 (date->JD 2013 1 20)))
2013031
_$

JuLian Day  维基百科介绍
http://zh.wikipedia.org/wiki/%E5%84%92%E7%95%A5%E6%97%A5

Date 系统变量
只读)
类型:实数
保存位置:未保存
初始值:不确定

以“修改的 Julian 日期”格式存储当前的日期和时间。此值表示为“修改的 Julian 日期”(MJD),它的格式为 Julian 日期编号加上时间的小数代码:

<Julian 日期编号>.<时间的小数代码>

“修改的 Julian 日期”(通常称为 UT1)是一个全世界的科学性标准,用以指定自公元前 4713 年 1 月 1 日 12:00 a.m. (B.C.E.) 起的天数。按照此系统,1997 年 7 月 4 日 2:29:58 p.m. 表示为 2450634.60387736,而 1998 年 1 月 1 日正午 12:00 则相应地表示为 2450815.50000000。

通过用 DATE 返回的数字相减可计算出日期和时间的差别。要用 DATE 返回的值计算从午夜开始的秒数,可以使用以下 AutoLISP 表达式:

(setq s (getvar "DATE"))(setq seconds (* 86400.0 (- s (fix s))))

因为计算机的时钟能提供日期和时间,所以仅当系统时钟被设置为 UTC/Zulu(格林尼治标准时间)时,DATE 系统变量才返回真正的 Julian 日期。系统变量 TDCREATETDUPDATE 与 DATE 格式相同,但这两个变量的值分别表示当前图形的创建时间和最后更新的时间。

点评

长老速度真快啊  详情 回复 发表于 2013-9-4 23:08

评分

参与人数 1威望 +1 贡献 +3 收起 理由
snsj + 1 + 3 及时回复奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2013-9-4 23:08:22 | 显示全部楼层
Free-Lancer 发表于 2013-9-4 22:52
翻出来两个函数,时间太久忘记出处了

_$ (date->JD 2013 1 20)

长老速度真快啊

点评

呵呵,一个存货,JD->date 最后日小于10没有加0,代码已修改  详情 回复 发表于 2013-9-4 23:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-9-4 23:31:06 | 显示全部楼层
snsj 发表于 2013-9-4 23:08
长老速度真快啊

呵呵,一个存货,JD->date 最后日小于10没有加0,代码已修改
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-5 00:32:56 | 显示全部楼层
.net的简单两行,其实里面封装了日期的算法,大小月,瑞年什么的,你直接和LISP比,对LISP不公平,如果平时自己有计算日期的函数,那么LISP也是简单的一行。{:soso_e113:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-9-6 10:51:42 | 显示全部楼层
ET工具箱中有一个julian.lsp
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-9-6 12:34:06 | 显示全部楼层
以前写过一个阳历和农历日期换算的程序,从里面摘出一些代码,修改成题目要求的代码!
  1. ;;计算某某日期n天后的时间 By Gu_xl
  2. ;;示例 (getday 2013 8 5 50) 返回 (2013 9 24 "星期二")
  3. (defun getday (YEAR  MONTH   DAY    ADDDAY   /      RUNNIAN
  4.          DAYS  MONTHADD WEEKNAME THEDATE  WEEK      MONDAY
  5.          MOMTH
  6.         )
  7. ;|闰年的算法:
  8.     公历纪年法中,如果不是整百的年份,能被4整除的是闰年,如2008是闰年,
  9.     2009是平年。整百的年份能被400整除的,是闰年;但能被3200整除的并不是
  10.     闰年;如1900年是平年,2000年是闰年,2100年是平年,3200年是平年.
  11.   |;
  12.   (defun runnian (year)
  13.     (cond
  14.       ((= 0 (rem year 3200)) nil)
  15.       ((= 0 (rem year 400)) T)
  16.       ((AND
  17.    (= 0 (rem year 4))
  18.    (/= 0 (rem year 100))
  19.        )
  20.        T
  21.       )
  22.       (T NIL)
  23.     )
  24.   )

  25.   ;;每月天数
  26.   (if (runnian YEAR)
  27.     (setq days '(31 29 31 30 31 30 31 31 30 31 30 31))
  28.     (setq days '(31 28 31 30 31 30 31 31 30 31 30 31))
  29.   )
  30.   (setq  ;;公历每月前面的天数
  31.   MonthAdd '(0 31 59 90 120 151 181 212 243 273 304 334)
  32.   weekname '("星期日" "星期一" "星期二" "星期三" "星期四"  "星期五"
  33.        "星期六")
  34.   )

  35.   ;;计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)
  36.   (setq  TheDate  (+ (* (- Year 1921) 365)
  37.        (/ (- Year 1921) 4)
  38.        Day
  39.        (nth (1- month) MonthAdd)
  40.        -38
  41.        addday
  42.     )
  43.   )

  44.   (If (and
  45.   (= (rem year 4) 0)
  46.   (> month 2)
  47.       )
  48.     (setq TheDate (1+ TheDate))
  49.   )
  50.   ;;计算星期
  51.   (setq week (nth (rem (1+ TheDate) 7) weekname))
  52.   (while (> AddDay 0)
  53.     (setq monday (nth (1- MONTH) days))
  54.     (if  (<= AddDay (- monday day))
  55.       (setq day     (+ day AddDay)
  56.       AddDay 0
  57.       )
  58.       (progn

  59.   (setq AddDay (- AddDay (- monday day))
  60.         MONTH  (1+ MONTH)
  61.         day    0
  62.   )
  63.   (if (> MONTH 12)
  64.     (progn
  65.       (setq MONTH  1
  66.       year  (1+ year)
  67.       )
  68.       (if  (runnian YEAR)
  69.         (setq days '(31 29 31 30 31 30 31 31 30 31 30 31))
  70.         (setq days '(31 28 31 30 31 30 31 31 30 31 30 31))
  71.       )
  72.     )
  73.   )
  74.       )
  75.     )

  76.   )
  77.   ;;返回值 年 月 日 星期
  78.   (list year MONTH day week)
  79. )

点评

给力,公历和农历转换的算法具体是什么?  详情 回复 发表于 2013-9-6 12:51
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-6 12:51:46 | 显示全部楼层
牢固 发表于 2013-9-6 12:34
以前写过一个阳历和农历日期换算的程序,从里面摘出一些代码,修改成题目要求的代码!

给力,公历和农历转换的算法具体是什么?

点评

以下是阳历转换农历的函数 ;;(gxl-GetNonli 年 月 日) 由阳历计算农历,只能计算1921.2.8号以后的历法 By Gu_xl ;;返回表'(公元年 月 日 星期 农历年 月 日 属相) ;;(gxl-GetNonli 2013 2 10) 返回 ("2013" "02" "  详情 回复 发表于 2013-9-6 13:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-9-6 13:47:46 | 显示全部楼层
newer 发表于 2013-9-6 12:51
给力,公历和农历转换的算法具体是什么?

以下是阳历转换农历的函数
;;(gxl-GetNonli 年 月 日) 由阳历计算农历,只能计算1921.2.8号以后的历法 By Gu_xl
;;返回表'(公元年 月 日 星期 农历年 月 日 属相)
;;(gxl-GetNonli 2013 2 10) 返回 ("2013" "02" "10" "星期日" "癸巳" "正" "初一" "蛇")
游客,本帖隐藏的内容需要积分高于 30 才可浏览,您当前积分为 0

评分

参与人数 2威望 +1 D豆 +10 贡献 +3 收起 理由
xtdwynij + 5 高得没边了!这也能搞!
snsj + 1 + 5 + 3 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-7 01:26:57 | 显示全部楼层
固版什么都写过啊,再引申一点都可以做个算命软件了,算算哪天易出行,哪天易交友。。。。:lol
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 55个

财富等级: 招财进宝

发表于 2020-2-16 19:35:23 | 显示全部楼层
真好牛啊同志们
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2021-4-26 11:39:03 | 显示全部楼层
本帖最后由 aeo 于 2021-4-26 15:53 编辑

;时间再加30年,需要的自己更新
(setq nongliData '(
2635 333387 1701 1748 267701 694 2391 133423 1175 396438
3402 3749 331177 1453 694 201326 2350 465197 3221 3402
400202 2901 1386 267611 605 2349 137515 2709 464533 1738
2901 330421 1242 2651 199255 1323 529706 3733 1706 398762
2741 1206 267438 2647 1318 204070 3477 461653 1386 2413
330077 1197 2637 268877 3365 531109 2900 2922 398042 2395
1179 267415 2635 661067 1701 1748 398772 2742 2391 330031
1175 1611 200010 3749 527717 1452 2742 332397 2350 3222
268949 3402 3493 133973 1386 464219 605 2349 334123 2709
2890 267946 2773 592565 1210 2651 395863 1323 2707 265877
1706 2773 18869 1206 51799 2638 3366 44691 3411 1450
26293 2413 92509 1197 2637 55883 3365 3410 44458 2906
1389 18779 1179 62615 2635 2725 46757 1746 2778 27319 ))

数据不一定对,看下面的帖子,数据来自网上,我也不能说别人不对是不,看我后面自己计算的数据

点评

请教版主 您这个30年是到 2021+30=2051年吧 谢谢您  详情 回复 发表于 2021-4-26 14:12
请教版主 您这个30年是到 2021+30=2051年吧 谢谢您  详情 回复 发表于 2021-4-26 14:05
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6881个

财富等级: 富甲天下

发表于 2021-4-26 14:05:50 | 显示全部楼层
aeo 发表于 2021-4-26 11:39
;时间再加30年,需要的自己更新
(setq nongliData '(
2635 333387 1701 1748 267701 694 2391 133423 1175 ...

请教版主
您这个30年是到
2021+30=2051年吧
谢谢您
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6881个

财富等级: 富甲天下

发表于 2021-4-26 14:12:33 | 显示全部楼层
本帖最后由 ynhh 于 2021-4-26 14:25 编辑
aeo 发表于 2021-4-26 11:39
;时间再加30年,需要的自己更新
(setq nongliData '(
2635 333387 1701 1748 267701 694 2391 133423 1175 ...

请教版主
您这个30年是到
2021+30=2051年吧
谢谢您
("2032" "01" "13" "星期二" "辛亥" "腊" "初二" "猪")
网上的万年历查询为 初一,差一天 ,本月均差一天。

点评

aeo
有些好像不对,数据不一样,你用我自己的数据测试一下,到2100年的数据,在下面  详情 回复 发表于 2021-4-26 14:49
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2021-4-26 14:42:26 | 显示全部楼层
本帖最后由 aeo 于 2021-4-26 15:24 编辑

上面我贴的数据来源:
数据来源 https://github.com/swordzjj/PyLu ... /CalendarConvert.py
我从其他数据算出来,有些好像不对,请大家测试


大家测试一下

后面一页有我自己计算的数据,大家测试
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-3-29 15:05 , Processed in 0.507405 second(s), 67 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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