Подтвердить что ты не робот

Расчет будущей эпохи Время в С#

Мне удалось найти пример кода, чтобы получить текущую временную метку в эпоху Linux (Seconds since Midnight 1 января 1970 года), однако мне трудно найти пример, как рассчитать, что будет в будущем Epoch, скажем, например, через 10 минут, так как я могу рассчитать будущее время в Linux Epoch?

4b9b3361

Ответ 1

Этот метод расширения должен выполнять следующее задание:

private static double GetUnixEpoch(this DateTime dateTime)
{
    var unixTime = dateTime.ToUniversalTime() - 
        new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

    return unixTime.TotalSeconds;
}

И вы можете использовать его как таковое:

var unixTime1 = DateTime.Now.GetUnixEpoch(); // precisely now
var unixTime2 = (DateTime.Now + new TimeSpan(0, 10, 0)).GetUnixEpoch(); // 10 minutes in future

Обратите внимание, что вам нужно иметь дело со всеми датами в UTC (Universal Time), так как это определено как начало Unix Epoch.

Ответ 2

Есть интересный поворот, когда вы хотите узнать время эпохи Unix в .Net в системе Windows.

Практически во всех практических случаях и при условии, что текущее время прошло за эпоху Unix, вы действительно можете взять

System.TimeSpan timeDifference = DateTime.UTCNow - 
            new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
long unixEpochTime = System.Convert.ToInt64(timeDifference.TotalSeconds);

Но,

Unix Epoch Time определяется как "... система для описания точек во времени, определяемая как количество секунд, прошедших с полуночи. Скоординированное универсальное время (UTC) от 1 января 1970 года, не считая секунд прыжка". (1)

С 1972 года UTC включает в себя "прыжковые секунды", и до сих пор у нас было в общей сложности 25 из них. (2)

.NET DateTime не имеет резервов для Leap Seconds, но будет просто полагаться на время ОС. Windows блаженно не знает о прыжках секунд (3) (4), и поэтому просто будет иметь представление о времени, когда он получает его от своего ведущего NTP (я считаю, что по умолчанию для не подключенного к домену компьютера - time.windows.com), который, вероятно, обслуживает UTC, включая секунды прыжка.

Это означает, что для того, чтобы быть педантичным правилом относительно реального количества секунд, прошедших с эпохи Unix, вы должны, вероятно, добавить секунды прыжка к результату, полученному выше, для приложений, которые полагаются на это. Вам нужно будет отслеживать количество секунд, которое нужно добавить каждый раз, поскольку секунды прыжка не объявляются заранее (2). Однако, поскольку определение Unix Epoch Time явно исключает секунды прыжка, вы можете спокойно проигнорировать это и просто пересчитать секунды с текущего времени UTC.

Иногда, прыжки секунд действительно вызывают погрешность программного обеспечения (5). Продолжается дискуссия о том, следует ли продолжать или отменять практику (6) (7) (8).

Последняя секундная скачка во время ответа произошла 1 июля 2012 года (9) и вызвала проблемы для различных сайтов и приложений (10)

(1) http://en.wikipedia.org/wiki/Unix_time

(2) http://en.wikipedia.org/wiki/Leap_second

(3) http://support.microsoft.com/kb/909614

(4) http://www.meinberg.de/english/info/leap-second.htm

(5) http://www.networkworld.com/news/2009/010609-leap-second-snafu-affects-oracle.html

(6) http://www.pcworld.idg.com.au/article/358024/time_waits_no_one_leap_seconds_may_cut/

(7) http://queue.acm.org/detail.cfm?id=1967009

(8) http://arxiv.org/abs/1106.3141

(9) http://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat

(10) http://arstechnica.com/business/2012/07/one-day-later-the-leap-second-v-the-internet-scorecard/

(Первоначальный ответ был ошибкой, который, к счастью, привлек комментаторы Эдвард Брей и Мормегил ниже)

Ответ 3

Какую функцию вы используете для получения текущего времени?

Уверен, что принимает параметр .NET DateTime...

Конечно, это просто вопрос передачи в будущем DateTime функции.

или делать DateDiff в секундах между текущим временем и будущим временем и добавлять это.

var dt = new DateTime(1970, 1, 1, 0, 0, 0).ToUniversalTime();

var now = System.DateTime.Now.ToUniversalTime();
var future = new DateTime(2010, 1, 1).ToUniversalTime();

Console.WriteLine((now - dt).TotalSeconds);
Console.WriteLine((future - dt).TotalSeconds);

Ответ 4

Базовое решение:

  • Текущее время
  • Добавить смещение в будущее (10 минут в вашем примере)
  • Вычитание полуночи 1 января 1970 года.
  • Получить общее количество секунд между двумя

В С# (с верхней части моей головы, непроверенный):

DateTime myEpoch = DateTime.Now.Add( new TimeSpan(...) );
return myEpoch.Subtract( new DateTime(1970, 1, 1, 0, 0, 0) ).TotalSeconds;