一个关于时间的算法求解!
我想解决这样的一个问题:
算出当前日期与以前一固定日期相差的时间,以年、月、天的方式显示出来
比如:
第一日期是:2005-6-4
第二日期是:2004-6-10
算出的结果应该是:0年12个月25天
求其算法!
问题点数:20、回复次数:17Top
1 楼lovebeyondforever(我不信)回复于 2005-06-04 21:18:16 得分 0
<script language="vbScript">
<!--
a=cdate("2005-6-4")
b=cdate("2004-6-10")
c=DateDiff("d",a,b)
msgbox c
-->
</script>Top
2 楼qiozi(【悟】.欢希欢南换)回复于 2005-06-04 21:27:51 得分 0
11个月吧, 12个月,咋还会是0年?
Top
3 楼dddggg(罡子)回复于 2005-06-04 21:27:52 得分 0
不行呀,我要算出这个数字是几年几月几天的呀!!!!!!!!!Top
4 楼dddggg(罡子)回复于 2005-06-04 21:57:12 得分 0
呵呵,写错了,应该是0年11个月25天,请指高招!Top
5 楼yupenger690(烟波淼淼)回复于 2005-06-04 22:27:38 得分 0
我也有相同的问题啊!怎么计算两个时间之间的差值啊?Top
6 楼lovebeyondforever(我不信)回复于 2005-06-04 22:33:18 得分 0
不好意思 没看清题目
<script language=vbs>
myTime = "2004-6-10"
myTime2= "2005-6-4"
document.Write cdate(cdate(myTime2)-cdate(myTime))
</script>
结果:
1900-12-24 郁闷!Top
7 楼dddggg(罡子)回复于 2005-06-04 22:34:59 得分 0
这个问题我用了好几个笨的方法来算也没有算出来!麻烦呀!Top
8 楼loveasp007(爱死拼)回复于 2005-06-05 01:19:27 得分 0
应该没问题的,时间太紧了,我还要做网站,帮你顶下吧.Top
9 楼IT_Fish(游泳在IT的鱼)回复于 2005-06-05 01:49:35 得分 1
<Script Language = "JavaScript">
function time1()
{
now=new Date();
m=now.getMonth();
n=now.getYear()
a=2005-now.getYear();
b=12-now.getMonth();
if(m=1,3,5,7,8,10,12){c=31-now.getDate()}
if(m=4,6,9){c=30-now.getDate()}
if(m=2){c=28-now.getDate()}
if(n=2004,2008){c=29-now.getDate()}
e="0"+24-now.getHours();
f="0"+59-now.getMinutes();
g="0"+60-now.getSeconds();
if(e>10){e=24-now.getHours()}
if(f>10){f=59-now.getMinutes()}
if(g>10){g=60-now.getSeconds()}
if (a<0) {a=0}
if (b=12) {b=0}
document.Time.CLOCK.value="离此版块开通还有"+a+"年"+b+"个月"+c+"天"+e+"小时"+f+"分"+g+"秒"
setTimeout( 'time1()',1000)
}
</SCRIPT>
自己看下吧,原理相同Top
10 楼renjunjun(飞黄)回复于 2005-06-05 02:10:30 得分 17
20分这么多还记我写半天,原理什么的我就不说了,我只给正确结果,分不都给我下次看见你我就闪哦!
嘿嘿,大家不好意思了!总之一句话:思路比技术重要!
<%
Date1=#2004-6-10#:Date2=#2005-6-4#:I=0
Response.Write "较小日期:" & Date1 & "<br>"
Response.Write "较大日期:" & Date2 & "<br>"
do until DateAdd("yyyy",I,Date1)>Date2:I=I+1:loop
TheYear=I-1:I=0:Date1=DateAdd("yyyy",TheYear,Date1)
do until DateAdd("m",I,Date1)>Date2:I=I+1:loop
TheMonth=I-1:I=0:Date1 =DateAdd("m",TheMonth,Date1)
do until DateAdd("d",I,Date1)>Date2:I=I+1:loop
TheDay=I-1:I=0:Date1=DateAdd("d",TheDay,Date1)
Response.Write "相差时间:" & TheYear & "年" & TheMonth & "月" & TheDay & "日"
%>Top
11 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2005-06-05 02:47:24 得分 0
你的问题不合理,半月怎么算?Top
12 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2005-06-05 02:49:21 得分 0
日期是直接可以做循环的,这么写就行
for i=Cdate("2005-6-4") to Cdate("2004-6-10")
nextTop
13 楼renjunjun(飞黄)回复于 2005-06-05 02:55:21 得分 0
笨狼兄,楼上这段何解?没有理解,难道是思路问题?Top
14 楼wtogether(wtogether)回复于 2005-06-05 09:17:45 得分 1
<script language="vbscript">
a = CDate("2005-6-4")
b = CDate("2004-6-10")
c = DateDiff("d", b, a)
y = c\365
m = (c mod 366)\30
d = c
For i=1 To m
Select Case i
case 1, 3, 5, 7, 8, 10, 12
d = d - 31
Case 2
d = d - 29'2月你按29天算就是0年11月24天,按28天算就是0年11个月25天
Case Else
d = d - 30
End Select
Next
Alert y & "年" & m & "月" & d & "日"
</script>
Top
15 楼ShiningstarHu(Shining_star)回复于 2005-06-05 11:46:51 得分 1
wtogether(wtogether) 的方法和我想得一样,原理是把两个日期之间的差用需求所需的最小单位来计算,这里是天,因此他用了Datadiff("d",...,...)的方法求所差得天数,但是他这个方法是有问题的.
最后的一个循环有点画蛇添足了. 他用两个日期之间的总天数循环去减经历的月份,根据大月小月的判断不断去减30或者31,并且考虑到了闰年问题,这种做法只有在需要比较的这两个日期之间正好是一整年或者是1整年的倍数.也就是说这两个日期之间经历1-12月的次数是相同的才能得出正确结果.
如果我现在给两个日期b = CDate("2005-7-1") a = CDate("2005-8-31") ,根据DateDiff返回值是61天,如果b = CDate("2005-7-1") a = CDate("2005-9-30")DateDiff返回值是91天,根据wtogether(wtogether)的方法我的第一个例子的结果是 "0年2月1天" 第二个例子的结果是 "0年3月0天" 但事实上,我这两个例子的结果应该很明确第一个是2个月,第二个是3个月.
wtogether(wtogether)的方法问题就在于最后那个循环,因为他总是从1月开始做起,结果我给的两个例子中没有一个是有1月的,只不过他们之间差了2个月或者3个月.
因此,wtogether(wtogether)的方法需要修改.简单的修改就是首先去掉最后一个循环.
<script language="vbscript">
a = CDate("2005-6-4")
b = CDate("2004-6-10")
c = DateDiff("d", b, a)
y = c\365 '不能简单的除以365天,要看两个日期间到底经历过多少个闰年的2月
'后面的365也是一样的处理.
m = (c mod 365)\30 '这里其实要除以每月的平均天数而不是简单的30天
d = (c mod 365) mod 30 '这里除的余数其实就是天数了.(但是一样不是简单的30,要和上面的一样)
Alert y & "年" & m & "月" & d & "日"
'经过这样修改,搂住可以准确地求出你需要的答案 :)
</script>
Top
16 楼renjunjun(飞黄)回复于 2005-06-05 17:53:33 得分 0
哈哈,还是我的算法精确!Top
17 楼dddggg(罡子)回复于 2005-06-07 11:49:47 得分 0
大家辛苦了,renjunjun(飞黄) 写的的确不错,最大分就给你,其他仁兄就分配点小分吧,以此鼓励,希望renjunjun(飞黄)不要太介意!有福要同享呀!:)Top




