只是一个随机的问题,但有没有人知道如何计算时间戳的公式?我猜它必须考虑每个月,多少天,闰年等等。
由于
答案 0 :(得分:7)
以下是从wikipedia article:
计算Unix时间戳的示例Unix时间号为零 Unix时代,并且完全增加 自纪元以来每天86 400。从而 2004-09-16T00:00:00Z,12 677天 在纪元之后,由代表 Unix时间号12 677×86 400 = 1 095 292 800.这可以延长 从时代倒退,使用 负数;从而 1957-10-04T00:00:00Z,4 472天 在纪元之前,由代表 Unix时间数-4 472×86 400 = -386 380 800。
答案 1 :(得分:6)
如果您对实施感兴趣,那么大致是如何计算Windows时间戳(也称为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);
}
答案 2 :(得分:1)
通常是特定日期以来经过的时间。在unix时间的情况下,它是自1970年1月1日以来经过的时间,以秒为单位。