2010-07-22 8 views

Odpowiedz

6

Jeśli zainteresowany realizacją jest tu mniej więcej, jak system Windows datownik można obliczyć (znany również jako 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); 
} 
+0

ja chce napisać to w PHP. – David

+1

@ David: Funkcje PHP 'time' i' gmmktime' zwracają znaczniki czasu uniksowego. Jeśli chcesz, możesz przekonwertować go na tiki jako '621355968000000000 + unixTimestamp * 10000000' – Regent

+0

co to jest 0xd6bf94d5e5L, 0xc92a69c000L i 922337203685L? –

1

Zazwyczaj jest to czas, który upłynął od określonej daty. W przypadku czasu unix, jest to czas, który upłynął od 1 stycznia 1970 w sekundach.

6

Oto przykład jak Unix timestamp jest obliczana z wikipedia article:

Liczbę czas uniksowy jest zerem na Unix epoki, a zwiększa się dokładnie 86 400 dziennie od epoki. Tak więc 2004-09-16T00: 00: 00Z, 12 677 dni po epoce reprezentuje numer UNIX czasowy 12 677 × 86 400 = 1 095 292 800. To może być przedłużony wstecz również z epoki , używając liczb ujemnych; zatem 1957-10-04T00: 00: 00Z, 4 472 dni przed epoki jest przedstawiony ilość czasu Unix -4 472 x 400 = 86 -386 380 800.

Powiązane problemy