如何两个日期间的差值?thank

sektor 2002-06-16 05:38:47
比如:
date1与date2分别代表两个日期
如何计算出两者之间相差?年?月?日呢?
比如:2001-6-6与2002-6-16日,用datediff分别可以得到
1年,12月,375天。
当然,这里可以这样计算:
设以上采用变量:x,y,Z表示datediff结果
结果表达式可以不十分精确地写成:
x年,(y-x*12)月,(z-x*365)天,
要是想更精确,我想只好再加进闰年的算法了。
所以,我想知道,VB里有没有现成的计算方法呢??谢谢高手指教。
...全文
115 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
viperstorm 2002-06-17
  • 打赏
  • 举报
回复
统一按平年 365 日来算吧。
sektor 2002-06-17
  • 打赏
  • 举报
回复
1、回复人: w_lion(豆腐) ( ) 信誉:97
你的问题真奇怪
MsgBox DateDiff("d", "2001 - 6 - 6", "2002 - 6 - 16")
我得到了375天
----------------------------------------------------------------
本来就是375天。datediff("d",date1,date2)就是计算两日期间天数。


2、我觉得你的说法有问题,我们平时说的相差几个月,谁会特别说明是那几个月份,或者是否有闰月。如果按你的算法算出了几年几月,别人也很可能按一年12个月,1月30天来换算成天,反而曲解了你的意思,除非你附上特别声明。所以我看还是直截用天表示比较明白。
--------------------------------------------------------------------
比如:库中某人是十年前生的,那直接用datediff("d"....)得到天是简单,
但让用户看到的是某人活了365X天.......呵。
关于大月、小月、闰年的考虑我觉得还有必要,比如:
设某年是闰年:
那出生日期是:2月27日,程序查看的时候是3月2日,你觉得有必要么?
3、回复人: ragweed_wg(冷月一刀) ( ) 信誉:120
Cdate("2002-6-16") - Cdate("2001-6-6")
试试看!
--------------------------------------------------------------------
谢谢,可能你理解错了我的意思。




ragweed_wg 2002-06-17
  • 打赏
  • 举报
回复
Cdate("2002-6-16") - Cdate("2001-6-6")
试试看!
w_lion 2002-06-17
  • 打赏
  • 举报
回复
我觉得你的说法有问题,我们平时说的相差几个月,谁会特别说明是那几个月份,或者是否有闰月。如果按你的算法算出了几年几月,别人也很可能按一年12个月,1月30天来换算成天,反而曲解了你的意思,除非你附上特别声明。所以我看还是直截用天表示比较明白。
w_lion 2002-06-17
  • 打赏
  • 举报
回复
你的问题真奇怪

MsgBox DateDiff("d", "2001 - 6 - 6", "2002 - 6 - 16")
我得到了375天
sektor 2002-06-17
  • 打赏
  • 举报
回复
老大,看看题目啊。你这个估计谁手上都有一份呢。呵。msdn现在都快烂街了,咱这10块钱一套。
zyl910 2002-06-17
  • 打赏
  • 举报
回复
DateDiff 函数


返回 Variant (Long) 的值,表示两个指定日期间的时间间隔数目。

语法

DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])

DateDiff 函数语法中有下列命名参数:

部分 描述
interval 必要。字符串表达式,表示用来计算date1 和 date2 的时间差的时间间隔
Date1□date2 必要;Variant (Date)。计算中要用到的两个日期。
Firstdayofweek 可选。指定一个星期的第一天的常数。如果未予指定,则以星期日为第一天。
firstweekofyear 可选。指定一年的第一周的常数。如果未予指定,则以包含 1 月 1 日的星期为第一周。


设置

interval 参数的设定值如下:

设置 描述
yyyy 年
q 季
m 月
y 一年的日数
d 日
w 一周的日数
ww 周
h 时
n 分钟
s 秒


firstdayofweek 参数的设定值如下:

常数 值 描述
vbUseSystem 0 使用 NLS API 设置。
vbSunday 1 星期日(缺省值)
vbMonday 2 星期一
vbTuesday 3 星期二
vbWednesday 4 星期三
vbThursday 5 星期四
vbFriday 6 星期五
vbSaturday 7 星期六

常数 值 描述
vbUseSystem 0 用 NLS API 设置。
vbFirstJan1 1 从包含 1 月 1 日的星期开始(缺省值)。
vbFirstFourDays 2 从第一个其大半个星期在新的一年的一周开始。
vbFirstFullWeek 3 从第一个无跨年度的星期开始。


说明

DateDiff 函数可用来决定两个日期之间所指定的时间间隔数目。例如,可以使用 DateDiff 来计算两个日期之间相隔几日,或计算从今天起到年底还有多少个星期。

为了计算 date1 与 date2 相差的日数,可以使用“一年的日数”(y) 或“日”(d)。当 interval 是“一周的日数”(w) 时,DateDiff 返回两日期间的周数。如果 date1 是星期一,DateDiff 计算到 date2 为止的星期一的个数。这个数包含 date2 但不包含 date1。不过,如果 interval 是“周”(ww),则 DateDiff 函数返回两日期间的“日历周”数。由计算 date1 与 date2 之间星期日的个数而得。如果 date2 刚好是星期日,则 date2 也会被加进 DateDiff 的计数结果中;但不论 date1 是否为星期日,都不将它算进去。

如果 date1 比 date2 来得晚,则 DateDiff 函数的返回值为负数。

firstdayofweek 参数会影响使用时间间隔符号 “W” 或 “WW” 计算的结果。

如果 date1 或 date2 是日期文字,则指定的年份成为该日期的固定部分。但是,如果 date1 或 date2 用双引号 (" ") 括起来,且年份略而不提,则在每次计算表达式 date1 或 date2 时,当前年份都会插入到代码之中。这样就可以书写适用于不同年份的程序代码。

在计算 12 月 31 日和来年的 1 月 1 日的年份差时,DateDiff 返回 1 表示相差一个年份,虽然实际上只相差一天而已。
sektor 2002-06-17
  • 打赏
  • 举报
回复
又找了一些资料,好象没有发现现成的或可以简化过程的东东,于是写了下面这样的一个自定义函数true_age()返回实际年龄。另一个自定义函数month_day()得到当年某月是多少天。
btw:这里是我的程序中出现的一段代码,计算某人出生那天起到现在实际年龄是多少的。没想出更好的算法,还请高手指教。
====================================================================
Private Function true_age(olddate As Date) As String
Dim oldday As Integer
Dim oldmonth As Integer
Dim oldyear As Integer
Dim trueyear As Integer
Dim truemonth As Integer
Dim trueday As Integer
Dim inty As Integer
Dim intm As Integer
Dim intd As Integer
oldyear = CInt(Year(olddate))
oldmonth = CInt(Month(olddate))
oldday = CInt(Day(olddate))
trueyear = CInt(Year(Now))
truemonth = CInt(Month(Now))
trueday = CInt(Day(Now))
If CInt(DateDiff("d", olddate, Now)) < 0 Then
MsgBox "当前日期或出生年月有误。", vbInformation, "提示"
true_age = "日期有误"
Else
If (oldmonth <= truemonth And oldday <= trueday) Then
inty = trueyear - oldyear
intm = truemonth - oldmonth
intd = trueday - oldday
End If
If (oldmonth = truemonth And oldday > trueday) Then
inty = trueyear - oldyear - 1
intm = 0
intd = month_day(oldmonth) + trueday - oldday
End If
If (oldmonth < truemonth And oldday > trueday) Then
inty = trueyear - oldyear
intm = truemonth - oldmonth - 1
intd = month_day(oldmonth) + trueday - oldday
End If
If (oldmonth >= truemonth And oldday > trueday) Then
inty = trueyear - oldyear - 1
intm = 12 + truemonth - oldmonth - 1
intd = month_day(oldmonth) + trueday - oldday
End If
If (oldmonth > truemonth And oldday <= trueday) Then
inty = trueyear - oldyear - 1
intm = 12 + truemonth - oldmonth
intd = trueday - oldday
End If
If inty = 0 And intm = 0 And intd = 0 Then true_age = "刚出生"
If inty = 0 And intm = 0 And intd > 0 Then true_age = intd & "天"
If inty = 0 And intm > 0 And intd = 0 Then true_age = intm & "个月"
If inty = 0 And intm > 0 And intd > 0 Then true_age = intm & "个月零" & intd & "天"
If inty > 0 And intm = 0 And intd = 0 Then true_age = inty & "岁整"
If inty > 0 And intm = 0 And intd > 0 Then true_age = inty & "岁零" & intd & "天"
If inty > 0 And intm > 0 And intd = 0 Then true_age = inty & "岁零" & intm & "个月"
If inty > 0 And intm > 0 And intd > 0 Then true_age = inty & "岁零" & intm & "个月零" & intd & "天"
End If
End Function
'-------------------------------------------------------------------
'计算当年某月天数。主函数引用。
Private Function month_day(whichmonth As Integer) As Integer
Dim month_2 As Integer
If (Year(Now) Mod 4 = 0 And Year(Now) Mod 100 <> 0) Or Year(Now) Mod 400 = 0 Then '闰年
month_2 = 29
Else '平年
month_2 = 28
End If
Select Case whichmonth
Case 1, 3, 5, 7, 8, 10, 12
month_day = 31
Case 2
month_day = month_2
Case Else
month_day = 30
End Select
End Function
====================================================================
banweihui 2002-06-17
  • 打赏
  • 举报
回复
Cdate("2002-6-16") - Cdate("2001-6-6")
不行~我记得数据结构中好想有算法~你找找了 ~
qhzxcz 2002-06-17
  • 打赏
  • 举报
回复
我没办法
fontz 2002-06-17
  • 打赏
  • 举报
回复
标志
xfyxq 2002-06-16
  • 打赏
  • 举报
回复
好像没有,不过如果你把它做为一个自定义函数写出来的话,

只会麻烦这一次,

你以后使用起来,绝对不会麻烦了!!!
daehappy 2002-06-16
  • 打赏
  • 举报
回复
up!关注!
sektor 2002-06-16
  • 打赏
  • 举报
回复
补充:
天数的计算不正确,还要减掉不足一年的月数的对应天数。。。
这下觉得更麻烦了。。。:(

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧