// C/C++ code:
// Note: u32 = uint32_t, s32 = int32_t, f32 = float
void iiDateMath_get_YyyyMmDd_from_julian (u32 tnJulianDayNumber, u32* year, u32* month, u32* day);
void iiDateMath_get_HhMmSsMss_from_seconds(f32 tfSeconds, u32* hour, u32* minute, u32* second, s32* millisecond);
// Note: General form on disk:
struct SDateTime
{
s32 julian; // Julian day number
f32 seconds; // Seconds elapsed since midnight
};
//////////
//
// Computes the day, month, and year from a julian day number.
//
// Taken from:
// [URL unfurl="true"]http://stason.org/TULARC/society/calendars/2-15-1-Is-there-a-formula-for-calculating-the-Julian-day-nu.html[/URL]
//
// Returns:
// year -- The year
// month -- The month
// day -- The day
//
//////
void iiDateMath_get_YyyyMmDd_from_julian(u32 tnJulianDayNumber, u32* year, u32* month, u32* day)
{
u32 a, b, c, d, e, m;
// Validate the range
tnJulianDayNumber = min(max(tnJulianDayNumber, (u32)2299161/*Oct.15.1582*/), (u32)5373484/*Dec.31.9999*/);
// Compute
a = tnJulianDayNumber + 32044;
b = ((4 * a) + 3) / 146097;
c = a - ((b * 146097) / 4);
d = ((4 * c) + 3) / 1461;
e = c - ((1461 * d) / 4);
m = ((5 * e) + 2) / 153;
*day = e - (((153 * m) + 2) / 5) + 1;
*month = m + 3 - (12 * (m / 10));
*year = (b * 100) + d - 4800 + (m / 10);
}
//////////
//
// Takes the number of seconds elapsed since midnight and computes the time.
//
//////
void iiDateMath_get_HhMmSsMss_from_seconds(f32 tfSeconds, u32* hour, u32* minute, u32* second, s32* millisecond)
{
s32 lnMillisecond;
u32 lnHour, lnMinute, lnSecond;
// Make sure our parameters exist
if (!hour) hour = &lnHour;
if (!minute) minute = &lnMinute;
if (!second) second = &lnSecond;
if (!millisecond) millisecond = &lnMillisecond;
// Compute hour
*hour = (u32)tfSeconds / (60 * 60);
tfSeconds = tfSeconds - (f32)(*hour * 60 * 60);
// Compute minute
*minute = (u32)tfSeconds / 60;
tfSeconds = tfSeconds - (f32)(*minute * 60);
// Compute seconds
*second = (u32)tfSeconds;
tfSeconds = tfSeconds - (f32)*second;
// Compute milliseconds
*millisecond = (s32)(tfSeconds * 999.0);
}