2010-07-22 21 views

Respuesta

6

Si está interesados ​​en la aplicación aquí es más o menos cómo se puede calcular de Windows marca de tiempo (también conocido como 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

estoy queriendo escribir esto en PHP. – David

+1

@David: las funciones 'time' y' gmmktime' de PHP devuelven las marcas de tiempo Unix. Si lo desea, puede convertirlo en marcas como '621355968000000000 + unixTimestamp * 10000000' – Regent

+0

¿qué es 0xd6bf94d5e5L, 0xc92a69c000L y 922337203685L? –

1

Por lo general, es el tiempo transcurrido desde una fecha específica. En el caso del tiempo Unix, es el tiempo transcurrido desde el 1 de enero de 1970 en segundos.

6

Aquí está un ejemplo de cómo Unix timestamp se calcula a partir de la wikipedia article:

El número tiempo Unix es cero en el Unix época, y aumenta en exactamente 86 400 por día desde la época. Por lo tanto 2004-09-16T00: 00: 00Z, 12 677 días después de la época, está representado por el número de tiempo Unix 12 677 × 86 400 = 1 095 292 800. Esto se puede extender hacia atrás de la época también , usando números negativos; por lo tanto 1957-10-04T00: 00: 00Z, 4 472 días antes de la época, está representado por el número tiempo Unix -4 × 472 86 400 = -386 380 800.

Cuestiones relacionadas