Po prostu losowe pytanie, ale czy ktoś zna formułę obliczania znacznika czasu? Domyślam się, że musi rozważyć każdy miesiąc i ile dni, lata przestępne, itdJaka jest formuła obliczania znacznika czasu?
Dzięki
Po prostu losowe pytanie, ale czy ktoś zna formułę obliczania znacznika czasu? Domyślam się, że musi rozważyć każdy miesiąc i ile dni, lata przestępne, itdJaka jest formuła obliczania znacznika czasu?
Dzięki
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);
}
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.
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.
ja chce napisać to w PHP. – David
@ David: Funkcje PHP 'time' i' gmmktime' zwracają znaczniki czasu uniksowego. Jeśli chcesz, możesz przekonwertować go na tiki jako '621355968000000000 + unixTimestamp * 10000000' – Regent
co to jest 0xd6bf94d5e5L, 0xc92a69c000L i 922337203685L? –