计算时间戳的公式是什么?

时间:2010-07-22 12:55:04

标签: timestamp

只是一个随机的问题,但有没有人知道如何计算时间戳的公式?我猜它必须考虑每个月,多少天,闰年等等。

由于

3 个答案:

答案 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日以来经过的时间,以秒为单位。