zoukankan      html  css  js  c++  java
  • 关于VB日期与数字的转换(一)

    VB中可将日期作为实数的一部分来存储。小数点左边的数值表示日期:小数点右边的数值表示时间。负的数值表示在1899 年 12 月 30 日 之前。所以每一天可以用一个整数来表示(以1899-12-30 为0,该日之后为正数,之前为负数) ,对于MSVB 的合法日期,即#100-1-1# 到#9999-12-31#,就有-657434~2958465来表示。

    对于给定的日期,用Clng()可以获得该日期的整数,反过来,用Cdate()可以将-657434~2958465范围内的任意整数转换为相应的日期,但问题是,它是如何转换过来的?

    公历就是一种阳历,平年365天,闰年366天,每四年一闰,每满百年少闰一次,到第四百年再闰,即每四百年中有97个闰年。公历的历年平均长度(365.25日)与回归年(365.242189日)只有26秒之差,要累积3300年才差一日。

    下面就年份的转换作一分析:

    Function myyear(ByVal datenum As Long) As Integer
    datenum = datenum + 693960 ' #0001-1-1#--->#1899-12-30#之间的天数
    datenum = datenum + Int(datenum / 36525) - Int(datenum / 146100) - 1'对闰年所产生的多出来的天数进行修正。
    myyear = Int(datenum / 365.25)
    End Function

    '简化函数


    Function myyear2(ByVal datenum As Long) As Integer
    myyear2 = 1900 + Int((datenum + Int((datenum - 15) / 36525) - Int((datenum - 15) / 146100 + 1.75)) / 365.25)
    End Function

    测试:

    Private Sub Command1_Click()
    Dim i As Long
    For i = CLng(#1/1/100#) To CLng(#12/31/9999#)
    If Not Year(CDate(i)) = myyear2(i) Then Debug.Print i
    Next
    MsgBox "ok"
    End Sub

    所有日期计算都正确。

    注: 以上代码完全自创,但说实话,觉得自己也是吃饱撑的没事干。

  • 相关阅读:
    POJ 1330 Nearest Common Ancestors(LCA Tarjan算法)
    LCA 最近公共祖先 (模板)
    线段树,最大值查询位置
    带权并查集
    转负二进制
    UVA 11437 Triangle Fun
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
  • 原文地址:https://www.cnblogs.com/fengju/p/6336351.html
Copyright © 2011-2022 走看看