需要一个公式:从1月1日开始提取年份,0001 12:00 AM

输入:0001年1月1日以来的秒数

产出:在此期间的整年数量

我开发了一种我认为不是最佳解决方案的算法。 我认为应该有一个不涉及循环的解决方案。 请参阅代码块1,了解A)确定天数和B)迭代减去366或365(取决于来自当日的闰年总数),同时递增年份总计

这不像将DayCount除以365.2425和截断那么简单,因为我们在1月1日0002(31536000秒/(365.2425 * 24 * 60 * 60))= 0.99934时出现了失败点。

任何关于非循环方法从0001年1月1日起上午的秒数内提取年数的想法?

我需要弄清楚这一点,因为我需要一个长时间嵌入的日期(存储秒数),以便我可以用1秒的精度跟踪年数达到1200万以上。

代码块1 - 从秒中获得年数的低效算法(包括闰年)

        Dim Days, Years As Integer

        'get Days
        Days = Ticks * (1 / 24) * (1 / 60) * (1 / 60) 'Ticks = Seconds from Year 1, January 1

        'get years by counting up from the beginning
        Years = 0
        While True
            'if leap year
            If (Year Mod 4 = 0) AndAlso (Year Mod 100 <> 0) OrElse (Year Mod 400 = 0) Then
                If Days >= 366 Then 'if we have enough days left to increment the year
                    Years += 1
                    Days -= 366
                Else
                    Exit While
                End If
                'if not leap  year
            Else
                If Days >= 365 Then 'if we have enough days left to increment the year
                    Years += 1
                    Days -= 365
                Else
                    Exit While
                End If
            End If
        End While

        Return Years

编辑:我的解决方案是跳过在8位内嵌入日期的内存节省,并将每个值(通过几年的秒)存储在单独的整数。 这会导致以内存为代价的即时检索。

编辑2:第一次编辑错字(8位)


如果你需要精确到秒,你可能会需要一个商业级的日期时间包; 使用简单的算法做准确性太复杂了。 例如:

  • 很多人都注意到我们每4年就有一次闰年,但是您是否知道每年可以被100除尽而不是400闰年不是闰年? 即使在大型商业产品中也会引起问题。
  • 一些国家没有遵守日光节约措施,而那些遵守日光节约的国家在一年中的不同时间都会这样做。 这种情况每年都会随机变化。
  • 1582年前的年份使用略有不同的日历
  • 1582年只有355天(1752年为354天,视国家而定)。
  • 各国在切换时区时遇到重大问题。
  • 然后有闰秒。 一些理事机构任意决定我们是否应该每年增加一个(或有时两秒)时钟。 没有办法知道我们什么时候会有下一个闰秒,也没有过去闰秒的模式。
  • 由于这些和更多的复杂性,你最好不要自己编写代码,除非你可以放松你需要精确到第二个 1200万年以上的约束。

    “1582年10月4日 - 阿维拉的圣德肋撒去世了,她于10月15日翌日被埋葬。”


    Wikipeda在Julian Date上有一篇关于你可以适应你的需求的算法。


    Const TICKS_PER_YEAR As Long = 315360000000000
    Function YearsSinceBeginningOfTimeUntil(ByVal d As DateTime) As Integer
        Return Math.Floor(d.Ticks / TICKS_PER_YEAR)
    End Function
    
    链接地址: http://www.djcxy.com/p/3055.html

    上一篇: Need a formula: Extracting Years from Seconds Since January 1, 0001 12:00 AM

    下一篇: Converting Joda LocalTime to java.sql.Date