Just a random question but does anyone know the formula for how a timestamp is calculated? I am guessing it has to consider each month and how many days, leap years, etc.
Thanks
Just a random question but does anyone know the formula for how a timestamp is calculated? I am guessing it has to consider each month and how many days, leap years, etc.
Thanks
Usually it is the elapsed time since a specific date. In the case of unix time, it is the time elapsed since Jan 1, 1970 in seconds.
Here's an example of how Unix timestamp is calculated from the wikipedia article:
The Unix time number is zero at the Unix epoch, and increases by exactly 86 400 per day since the epoch. Thus 2004-09-16T00:00:00Z, 12 677 days after the epoch, is represented by the Unix time number 12 677 × 86 400 = 1 095 292 800. This can be extended backwards from the epoch too, using negative numbers; thus 1957-10-04T00:00:00Z, 4 472 days before the epoch, is represented by the Unix time number −4 472 × 86 400 = -386 380 800.
If you are interested in implementation here is roughly how Windows timestamp can be calculated (also known as ticks):
public static Int64 GetTimeStamp(
int year, int month, int day,
int hour, int minute, int second, int milliseconds)
{
Int64 timestamp = DateToTicks(year, month, day)
+ TimeToTicks(hour, minute, second);
return timestamp + milliseconds * TicksInMillisecond;
}
static readonly int[] DaysToMonth365 =
new int[] { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
static readonly int[] DaysToMonth366 =
new int[] { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 };
const long TicksInSecond = TicksInMillisecond * 1000L;
const long TicksInMillisecond = 10000L;
public static bool IsLeapYear(int year)
{
if ((year < 1) || (year > 9999))
throw new ArgumentOutOfRangeException("year", "Bad year.");
if ((year % 4) != 0)
return false;
if ((year % 100) == 0)
return ((year % 400) == 0);
return true;
}
private static long DateToTicks(int year, int month, int day)
{
if (((year >= 1) && (year <= 9999)) && ((month >= 1) && (month <= 12)))
{
int[] daysToMonth = IsLeapYear(year) ? DaysToMonth366 : DaysToMonth365;
if ((day >= 1) && (day <= (daysToMonth[month] - daysToMonth[month - 1])))
{
int previousYear = year - 1;
int daysInPreviousYears = ((((previousYear * 365) + (previousYear / 4)) - (previousYear / 100)) + (previousYear / 400));
int totalDays = ((daysInPreviousYears + daysToMonth[month - 1]) + day) - 1;
return (totalDays * 0xc92a69c000L);
}
}
throw new ArgumentOutOfRangeException();
}
private static long TimeToTicks(int hour, int minute, int second)
{
long totalSeconds = ((hour * 3600L) + (minute * 60L)) + second;
if ((totalSeconds > 0xd6bf94d5e5L) || (totalSeconds < -922337203685L))
throw new ArgumentOutOfRangeException();
return (totalSeconds * TicksInSecond);
}