15354.html

来自「以电子书的形式收集了VB一些常见问题解决方法,可以很方便的查找自己需要解决的问题」· HTML 代码 · 共 31 行

HTML
31
字号
<html>
  <head>
    <title>Re: 如何写出算出某日为星期几? (不使用 WEEKDAY)</title>
  </head>
  <body bgcolor="#FFFFFF" vlink="#808080">
    <center>
      <h1>Re: 如何写出算出某日为星期几? (不使用 WEEKDAY)</h1>
    </center>
<hr size=7 width=75%>

<hr size=7 width=75%><p>
Posted by <a href="mailto:honey0@tcts1.seed.net.tw">Honey</a> on July 08, 1999 at 07:08:39:<p>
In Reply to: <a href="15315.html">如何写出算出某日为星期几? (不使用 WEEKDAY)</a> posted by CHEN on July 07, 1999 at 08:00:43:<p>
: 如何写出算出某日为星期几, 是否有什么公式可算出? (不使用 WEEKDAY)<p>这个问题我蛮喜欢的 不过蛮烦的<br>我知道这有现成的公式 一时也找不到<br>我是从定义去推<br>这个问题比较难的部分是有闰月的时候<br>已知<br>/*1981年2月5日是星期四*/<-这是Honey的生日 要记的<p>闰年的定义是/*<br>年份能被4整除的为闰年<br>但这年若能被4也能被100整除 不为闰年<br>若能被100也能被200整除 这是闰年*/<p>有这两个定义 就能推出星期<p>由闰年的定义可知<br>在年的个位及十位不为零的时候<br>十位个位若能被4整除 这年是闰年<br>若在年的个位及十位不为零的时候<br>若百位是2,4,6,8,0时是闰年 否则便不是<br>于是便可定义以下函数<p>'/**********************************************************************<br>Public Function ChYears(LngYears As Long) As Boolean'/*传回Ture表闰年*/<br>'/*LngYears表年*/<br>Dim BytMY As Byte<br>BytMY = LngYears Mod 100'/*个位及十位数字*/<br>If BytMY Then '/*不等于0*/<br>    If BytMY Mod 4 = 0 Then<br>        ChYears = True'/*能被4整除为润*/<br>    Else<br>        ChYears = False'/*否则便不是*/<br>    End If<br>Else'/*个位及十位数字等于零(能被100整除)*/<br>    If LngYears Mod 200 = 0 Then<br>        ChYears = True'/*能被200整除为润*/<br>    Else<br>        ChYears = False'/*否则不是*/<br>    End If<br>End If<br>End Function<br>'**********************************************************************/<br>用上述判断法则知 1981 1982 1983都不是闰年 有365天<br>又365 mod 7 = 1 代表每加一年星期也得加1<p>1984年是闰年 有366天<br>又366 mod 7 = 2 代表每加一年星期也得加2<p>即1981年2月5日星期四 =>1982年2月5日星期五(因为1981不是闰年 加1)<br>即1982年2月5日星期五 =>1983年2月5日星期六(因为1982不是闰年 加1)<br>即1983年2月5日星期六 =>1984年2月5日星期日(因为1983不是闰年 加1)<br>即1984年2月5日星期日 =>1985年2月5日星期二(因为1984是闰年 加2)<br>要注意的是闰年加2反映在下一年<br>这样便很容易推出2000年2月5日是星期几<p>假设今天是2000年3月16日<p>设0代表星期日<br>  1代表星期一<br>      :<br>      :<br>  6代表星期六<br>把上式写成<br>'/*******************************************************************************<br>Public Function IntWeek(LngYears As Long) As Integer'/*传回LngYears年二月五日是星期几*/<br>Dim LngYSp As Long'/*用于for的指标*/<br>IntWeek = 4'/*1981年2月5日是星期四*/<br>If LngYears > 1981 Then'/*年份大于1981*/<br>        For LngYSp = 1982 To LngYears<br>        If ChYears(LngYSp - 1) Then'/*是闰年*/<br>            IntWeek = IntWeek + 2'/*闰年加二*/<br>            IntWeek = ChWeek(IntWeek)'/*呼叫自订函数将这个值介于0~7之间*/<br>        Else'/*不是闰年*/<br>            IntWeek = IntWeek + 1'/*非闰年加1*/<br>            IntWeek = ChWeek(IntWeek)'/*呼叫自订函数将这个值介于0~7之间*/<br>        End If<br>    Next<p>ElseIf LngYears = 1981 Then'/*刚好是1981年*/<br>    IntWeek = 4<br>Else<br>    For LngYSp = 1980 To LngYears Step -1'/*年份小于1981年*/<br>        If ChYears(LngYSp) Then'/*注意从1980年开始*/<br>            IntWeek = IntWeek - 2'/*闰年减二*/<br>            IntWeek = ChWeek(IntWeek) Mod 7'/*呼叫自订函数将这个值介于0~6之间*/<br>        Else<br>            IntWeek = IntWeek - 1'/*非闰年减一*/<br>            IntWeek = ChWeek(IntWeek) Mod 7'/*呼叫自订函数将这个值介于0~6之间*/<br>        End If<br>    Next<br>End If<br>End Function<p>Public Function ChWeek(IntWeek As Integer) As Byte'/*自订更正函数*/<br>While IntWeek < 0'/*若小于零加到大于等于零*/<br>    IntWeek = IntWeek + 7<br>Wend<p>If IntWeek > 7 Then<br>    IntWeek = IntWeek Mod 7'/*始介于0~6之间*/<br>End If<p>ChWeek = IntWeek'/*传回这个值*/<br>End Function<br>'*******************************************************************************/<br>呼叫IntWeek(N) 传回 N年2月5日星期几<br>碰巧2月5日在月29日之前<br>另外由观察可得另一种规律(因为每月日数固定)<br>若今年是闰年月份星期的差是<br>(规律1)<br>1 ->  4<br>2 ->  0<br>3 ->  1<br>4 ->  4 <br>5 ->  6<br>6 ->  2<br>7 ->  4<br>8 ->  0<br>9 ->  3<br>10->  5<br>11->  1<br>12->  3<br>若今年非闰年月份星期的差是<br>(规律2)<br>1 -> 4<br>2 -> 0<br>3 -> 0<br>4 -> 3<br>5 -> 5<br>6 -> 1<br>7 -> 3<br>8 -> 6<br>9 -> 2<br>10-> 4<br>11-> 0<br>12-> 2<p>上述方法已推出2000年二月5日星期六<br>又2000年是闰年 三月得加一 得7<br>即2000年3月5日星期日<br>日期是16日 16-5=11<br>(11+7) MOD 7 得 4<br>即2000年3月16日星期四<br>换算法如下<br>'/**********************************************************<br>Public Function BytMO(LngYears As Long, BytMonth As Byte, BytWeek As Byte) As Byte<br>'/*传回LngYears年BytMonth月5日星期几 BytWeek为函数IntWeek传回值*/<br>If ChYears(LngYears) Then<br>    Select Case BytMonth'/*闰年时*/<br>        Case 1, 4, 7'/*1, 4, 7月时和二月差 4 (规律1)*/<br>            BytMO = ChWeek(BytWeek + 4)'/*加4后将值定于0~6之间*/<br>        Case 2, 8'/*2, 8月时和二月差零(规律1)*/<br>            BytMO = BytWeek'/*将值定于0~6之间*/<br>        Case 3, 11'/*3, 11月时和二月差1 (规律1)*/<br>            BytMO = ChWeek(BytWeek + 1)'/*加1后将值定于0~6之间*/<br>        Case 5'/* 5月时和二月差6 (规律1)*/<br>            BytMO = ChWeek(BytWeek + 6)'/*加6后将值定于0~6之间*/<br>        Case 6'/* 6月时和二月差2(规律1)*/<br>            BytMO = ChWeek(BytWeek + 2)'/*加2后将值定于0~6之间*/<br>        Case 9, 12'/*9, 12月时和二月差3(规律1)*/<br>            BytMO = ChWeek(BytWeek + 3)'/*加3后将值定于0~6之间*/<br>        Case 10'/*10月时和二月差5(规律1)*/<br>            BytMO = ChWeek(BytWeek + 5)'/*加5后将值定于0~6之间*/<br>        Case Else<br>    End Select<br>Else<br>    Select Case BytMonth'/*非闰年*/<br>        Case 1, 10'/* 1, 10月时和二月差 4 (规律2)*/<br>            BytMO = ChWeek(BytWeek + 4)'/*加4后将值定于0~6之间*/<br>        Case 2, 3, 11'/* 2, 3, 11月时和二月差0  (规律2)*/<br>            BytMO = BytWeek'/*将值定于0~6之间*/<br>        Case 4, 7'/* 4, 7月时和二月差 3 (规律2)*/<br>            BytMO = ChWeek(BytWeek + 3)'/*加3后将值定于0~6之间*/<br>        Case 5'/* 5月时和二月差 5 (规律2)*/<br>            BytMO = ChWeek(BytWeek + 5)'/*加5后将值定于0~6之间*/<br>        Case 6'/* 6月时和二月差 1 (规律2)*/<br>            BytMO = ChWeek(BytWeek + 1)'/*加1后将值定于0~6之间*/<br>        Case 8'/* 8月时和二月差 6 (规律2)*/<br>            BytMO = ChWeek(BytWeek + 6)'/*加6后将值定于0~6之间*/<br>        Case 9, 12'/* 9, 12月时和二月差 2 (规律2)*/<br>            BytMO = ChWeek(BytWeek + 2)'/*加2后将值定于0~6之间*/<br>        Case Else<br>    End Select<br>End If<p>End Function<p>Public Function BytDay(BytdaYs As Byte, BytWeek As Byte) As Byte'/*传回介于0~6的值*/<br>BytDay = ChWeek(BytdaYs - 5 + BytWeek)<br>End Function<br>'*********************************************************************/<br>先呼叫BytMO(N,h,k)传回n年h月5日是星期几(K指N年2月5日星期几)<br>将这个值U 传给BytDay(T,U)传回值即为所求(T指N日)<p>统合以上函数 可以这样合成一个函数<br>'*************************************************************************************<br>Public Function GetNowWeek(LngYear As Long, BytMonth As Byte, BytDays As Byte) As Byte<br>Dim BytNowWeek As Byte<br>BytNowWeek = IntWeek(LngYear)<br>BytNowWeek = BytMO(LngYear, BytMonth, BytNowWeek)<br>BytNowWeek = BytDay(BytDays, BytNowWeek)<br>GetNowWeek = BytNowWeek<br>End Function<br>'**************************************************************************************<br>只要呼叫s=GetNowWeek(2010,8,24) 即可传回2010年8月24日星期s
<br>
<br><hr size=7 width=75%><p>
<a name="followups">Follow Ups:</a><br>
<ul><!--insert: 15354-->
<!--top: 15458--><li><a href="15458.html">定义错误</a> <b>Honey</b> <i>17:37:31 7/09/99</i>
(<!--responses: 15458-->1)
<ul><!--insert: 15458-->
<!--top: 15577--><li><a href="15577.html">谢谢您的说明</a> <b>CHEN</b> <i>12:21:08 7/13/99</i>
(<!--responses: 15577-->0)
<ul><!--insert: 15577-->
</ul><!--end: 15577-->
</ul><!--end: 15458-->
</ul><!--end: 15354-->
<br><hr size=7 width=75%><p>

</body></html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?