需要一个公式:从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位)
如果你需要精确到秒,你可能会需要一个商业级的日期时间包; 使用简单的算法做准确性太复杂了。 例如:
由于这些和更多的复杂性,你最好不要自己编写代码,除非你可以放松你需要精确到第二个 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