2010-07-22 36 views

risposta

6

Se sei interessato alla realizzazione qui è più o meno come di Windows timestamp può essere calcolato (noto anche come 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

sono voler scrivere questo in PHP. – David

+1

@David: le funzioni 'time' e' gmmktime' di PHP restituiscono Unix-timestamps. Se vuoi puoi convertirlo in ticks come '621355968000000000 + unixTimestamp * 10000000' – Regent

+0

cosa sono 0xd6bf94d5e5L, 0xc92a69c000L e 922337203685L? –

1

Di solito è il tempo trascorso da quando una data specifica. Nel caso di unix time, è il tempo trascorso dal 1 gennaio 1970 in secondi.

6

Ecco un esempio di come timestamp Unix viene calcolato dalla wikipedia article:

Il numero di tempo di Unix è zero al Unix epoca , e aumenta di esattamente 86 400 al giorno da quando l'epoca. Così 2004-09-16T00: 00: 00Z, 12 677 giorni dopo l'epoca, è rappresentato dal numero Unix 12 677 × 86 400 = 1 095 292 800. Questo può essere esteso anche dall'epoca all'epoca , utilizzando numeri negativi ; in tal modo 1957-10-04T00: 00: 00Z, 4 472 giorni prima dell'epoca, è rappresentato dal il numero tempo Unix -4 472 × 86 400 = -386 380 800.

Problemi correlati