Какова формула для вычисления метки времени?

Просто случайный вопрос, но кто-либо знает формулу для того, как метка времени вычисляется? Я предполагаю, что это должно рассматривать каждый месяц и сколько дней, високосных годов, и т.д.

Спасибо

7
задан David 22 July 2010 в 12:55
поделиться

3 ответа

Если вас интересует реализация, вот примерный способ вычисления временной метки Windows (также известной как тики):

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);
}
6
ответ дан 6 December 2019 в 15:17
поделиться

Обычно это время, прошедшее с определенной даты. В случае unix time это время, прошедшее с 1 января 1970 года в секундах.

1
ответ дан 6 December 2019 в 15:17
поделиться

Вот пример расчета временной метки 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.

7
ответ дан 6 December 2019 в 15:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: