【问】如何用VB高效的取得莫个日期的Day?

VBAHZ 2005-12-15 07:48:33

VB内部函数Day可以返回莫个日期的天数,
但现在实际应用时,要有数千万次的调用,这时Day函数就显得慢了许多。
而我们知道,日期型变量只是一个浮点数而已,对于纯日期而言,只是一个从1899

年12月31日开始的长整数(正数)而已,那样的话,
如果我们要自己做一个高效的Day函数,只是对一个整数进行计算而已(当然,有负

数的可能——1899年以前的日期)

而且,为了效率着想(没办法,必须用VB!!!)
应该尽量减少(只是减少哦)乘除法的计算

但不知道如何做?(最好能同时实现WeekDay)

俺不懂什么算法的,还请各位大虾帮帮忙,谢谢!
...全文
412 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
northwolves 2005-12-19
  • 打赏
  • 举报
回复
To rainstormmaster(暴风雨 v2.0):
你的代码有点问题:

Private Sub Form_Load()
Dim i As Long
For i = 1 To 40000
If Not Year(CDate(i)) = mYear(i) Then Debug.Print i
Next
End Sub

return:
2
367
732
1097
1098
1462
1463
1828
2193
2558
2559
2923
2924
3289
3654
4019
4020
4384
4385
4750
5115
5480
5481
5845
5846
6211
6576
6941
6942
7306
7307
7672
8037
8402
8403
8767
8768
9133
9498
9863
9864
10228
10229
10594
10959
11324
11325
11689
11690
12055
12420
12785
13150
13151
13516
13881
14246
14611
14612
14977
15342
15707
16072
16073
16438
16803
17168
17533
17534
17899
18264
18629
18994
18995
19360
19725
20090
20455
20456
20821
21186
21551
21916
21917
22282
22647
23012
23377
23378
23743
24108
24473
24838
25204
25569
25934
26299
26665
27030
27395
27760
28126
28491
28856
29221
29587
29952
30317
30682
31048
31413
31778
32143
32509
32874
33239
33604
33970
34335
34700
35065
35431
35796
36161
36526
37257
37622
37987
38718
39083
39448


看来,365.2425也不对。
rainstormmaster 2005-12-19
  • 打赏
  • 举报
回复
Private Function mYear(ByVal DateNum As Long) As Long
Dim a As Long
a = DateNum
a = a + 657434
a = a * 400&
a = a \ 146097 + 100
mYear = a
End Function
silence20 2005-12-19
  • 打赏
  • 举报
回复
修正~~~

新手问个问题,不知道对不对。高手指点一下拉

以闰年后的第一年作为开始如1001年1月1日

可不可以这样算38687/(365*4+1)得到的整数部分乘4得数值a;余数部分在除以365,整数部分加a加1000就是年份,余数部分就是天数

不知道可不可以,大家指点一下拉
silence20 2005-12-19
  • 打赏
  • 举报
回复
新手问个问题,不知道对不对。高手指点一下拉

以闰年后的第一年作为开始如1001年1月1日

可不可以这样算38687/(365*4+1)得到的整数部分乘4得数值a;余数部分在除以365,整数部分加a就是年份,余数部分就是天数

不知道可不可以,大家指点一下拉
northwolves 2005-12-19
  • 打赏
  • 举报
回复
由于年份的跨度有9900年,所以如果用365整数的话,每隔365年就会出现年份的偏移。
365.25已经接近了,也还是有偏差。。。
----------------
按365.2425,每一万年有三天的误差
setve 2005-12-17
  • 打赏
  • 举报
回复
我倒,各位真是大虾级人物,有现成的DAY不用,自己跑去计算,真是强人。
其实你们自己也都清楚,再写的多条语句会比集成的函数慢,那为什么不用现成的呢?高效率的时代不是把时间浪费在这上面的,你为什么不花功夫想想其实没有现成函数的东西来做呢
VBAHZ 2005-12-17
  • 打赏
  • 举报
回复
顺便提一下,MS的日期系统和UNIX不一样,
MS的好像不考虑一五几几年和一七几几年的那两次日历变换(少了十几天吧)
那我们也暂时不考虑这些,只以MS的日期型变量为准
VBAHZ 2005-12-17
  • 打赏
  • 举报
回复
To rainstormmaster(暴风雨 v2.0)

晕倒,老大,呵呵

那种算法的前提是先取到Day,然后来计算Weekday

但。。。本主题就是:如何取到Day?

我们唯一的参数,就是一个日期型变量,也就是一个以1899年12月31日开始的长整数(正数)
每过一天加1,比如现在参数为32000,那它的Day是多少?

俺只是希望在把那个整数转换为Day的时候,顺便得出WeekDay

估计应该先把32000化为年份,判断闰年否,再计算出月份,剩下来就是Day了,星期的计算更简单,只要计算出闰年数,就能算出星期的偏移数,再加上整除7的余数,加上那个起点日期的星期数,就可以了。

但又引出一个问题——如何把32000化为年份?并求得是该年的第几天?
这些VB都有内部函数对应的,我猜想他们也可能是这样算的,

但到底怎么做的?
LordSimon 2005-12-17
  • 打赏
  • 举报
回复
这个算相当复杂啊。。。要考虑很多内容。比如闰年之类。。。
关注一下。

ps:
在下知道计算机分为:电子数字计算计、电子模拟计算机、电子通用计算机...
VBAHZ 2005-12-17
  • 打赏
  • 举报
回复
终于有人动手实践了,呵呵
不像某些人,嘴里喊着要高效,
在真正要求高效的代码应用上,却还在用着蜗牛般的“集成函数”
说到底,是因为他们根本就写不出那些功能,自己又懒的动脑,才只能用着“集成函数”
还高效呢,如果在Basic时代,这些家伙还是回家吃老米饭,等着3000年以后,现成的掉钱函数出来吧

To northwolves(狼行天下) :
多谢兄弟捧场,谢谢!

自己计算确实比VB函数快,WeekDay是这样,Year也是这样(Day还是没有出来)

只是,兄弟的函数还没有完善,还不能适应VB的全日期范围。

俺的一些想法是:关键的是要定位准年份。
这就要考虑-657434、0、2958465三个数字的范围。
由于年份的跨度有9900年,所以如果用365整数的话,每隔365年就会出现年份的偏移。
365.25已经接近了,也还是有偏差。。。

还在想。。。。待续。。。。。。
northwolves 2005-12-17
  • 打赏
  • 举报
回复
自己算确实快些:

Sub getdate(ByVal number As Long, ByRef y As Integer)
If number = 1 Then y = 1899
If number > 1 Then y = Int((number - 1) / 365.25) + 1900
End Sub
Private Sub Command1_Click()
Dim d As Date, mytime As Long, y As Integer
mytime = Timer
For j = 1 To 10 ^ 7
y = Year(#1/1/2005#)
Next
Debug.Print "function year()"; Timer - mytime & " s"
mytime = Timer
For j = 1 To 10 ^ 7
getdate 38687, y
Next
Debug.Print "function userdefine()"; Timer - mytime & " s"
End Sub

return:

function year() 8.28125 s
function userdefine() 4.10625 s
northwolves 2005-12-17
  • 打赏
  • 举报
回复
楼主总能提出一些有创意的问题,给你写一个函数,测了一下从1899-12-31--->2005-1-1 的数据,基本没错:

Sub getdate(ByVal number As Long, ByRef y As Integer, Optional ByRef days As Integer)
If number = 1 Then y = 1899: days = 31
If number > 1 Then y = Int((number - 1) / 365.25) + 1900: days = Int(number-1 - (y - 1900) * 365.25)
End Sub
VBAHZ 2005-12-17
  • 打赏
  • 举报
回复
那要多大的表啊?

假设现在不考虑效率的问题,仅仅是:

将某个日期,比如:38353转为年份2005,并返回该年第1天

如何做???这个函数呢?
rainstormmaster 2005-12-17
  • 打赏
  • 举报
回复
//那个算法到好,求星期就简单的 Date Mod 7
这个,你加上个偏移量就可以了

//求年份 就是 (Date * 4) \ 1461
那还不如 Date \ 365 来得简单呢
但就是结果有问题,并不支持VB全日期范围,诶。。

呵呵,这个在人家的程序里说的很明白就是一个有限的范围1901-2078


其实最快的就是查表
VBAHZ 2005-12-17
  • 打赏
  • 举报
回复
To rainstormmaster(暴风雨 v2.0)
老大,那个算法有问题,好像不适合VB里的日期型变量
VB里支持 100-01-01 至 9999-12-31
默认星期天为1
那个算法到好,求星期就简单的 Date Mod 7
求年份 就是 (Date * 4) \ 1461
那还不如 Date \ 365 来得简单呢
但就是结果有问题,并不支持VB全日期范围,诶。。。
VBAHZ 2005-12-17
  • 打赏
  • 举报
回复
高效,绝对高效,快了差不多一倍不到一点(还是非编译状态的),
4.527344 => 2.664063
VBAHZ 2005-12-17
  • 打赏
  • 举报
回复
现在第一个问题,就是把整数转成年份?

比如:38687=》2005

rainstormmaster 2005-12-17
  • 打赏
  • 举报
回复
http://atlas.csd.net/~cgadd//knowbase/DATETIME0015.HTM
pascal程序,你参考一下( 里面的UnPackDate过程是你需要的)
rainstormmaster 2005-12-17
  • 打赏
  • 举报
回复
//用VB基本计算语句如何实现Day呢?
是可以实现还是不能实现?

实现是肯定可以实现,日期型变量的整数部分是1的话,对应的日期是1899-12-31,是2的话,对应的日期是1900-1-1,......,是366的话对应的日期是1900-12-31,......,是36526的话,对应的日期是2000-1-1......,编程的时候无非是处理一些基本的运算,问题是,编出来的程序是否能高效?
VBAHZ 2005-12-17
  • 打赏
  • 举报
回复
不好意思,上面是对setve(朱传辉) 说的,呵呵

还请问WallesCai(曾经沧海难为水,除却巫山不是云。此情可待成追忆,只是)

用VB基本计算语句如何实现Day呢?

是可以实现还是不能实现?
加载更多回复(10)

1,486

社区成员

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

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