Need a formula: Extracting Years from Seconds Since January 1, 0001 12:00 AM
Input: # of seconds since January 1st, of Year 0001
Output: # of Full years during this time period
I have developed an algorithm that I do not think is the optimal solution. I think there should be a solution that does not involve a loop. See Code Block 1 for the algorithm which A) Determines the quantity of days and B) Iteratively subtracts 366 or 365 depending on Leap Years from the Day Total while incrementing the Year Total
It's not as simple as Dividing DayCount by 365.2425 and truncating, because we hit a failure point at on January 1, 0002 (31536000 Seconds / (365.2425 * 24 * 60 * 60)) = 0.99934.
Any idea on a non-looping method for extracting years from a quantity of seconds since January 1, 0001 12:00 AM?
I need to figure this out because I need a date embedded in a long (which stores seconds) so that I can track years out to 12+ million with 1-second precision.
Code block 1 - Inefficient Algorithm to get Years from Seconds (Including Leap Years)
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
Edit: My solution was to skip the memory savings of embedding a date within 8 bits and to store each value (seconds through years) in separate integers. This causes instant retrievals at the expense of memory.
Edit2: Typo in first edit (8bits)
If you need accuracy to the very second, you'll probably want a commercial-grade datetime package; it's just too complex to do accurately with a simple algorithm. For instance:
Because of these and more complications, you are better off not writing the code yourself, unless you can relax the constraint that you need accuracy to the very second over 12-million years.
"October 4, 1582 – Saint Teresa of Ávila dies. She is buried the next day, October 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/3056.html
上一篇: 为什么C ++不支持堆栈上的动态数组?