2009-05-25 2 views
14

Я смог найти пример кода, чтобы получить текущую временную метку в эпоху Linux (Секунд с полуночи 1 января 1970 года), однако у меня возникли проблемы с поиском примера того, как рассчитать, что Эпоха будет быть в будущем, скажем, например, через 10 минут, так как я могу рассчитать будущее время в Linux Epoch?Расчет будущей эпохи Время в C#

+0

Вы заявили, что «как рассчитать, что будет в Эпохе в будущем, скажем, например, через 10 минут», сбивает с толку. Эпоха Unix всегда 01.01.1970 00:00:00, даже через 10 минут! Вы имеете в виду «как рассчитать количество секунд с момента, когда Unix Epoch будет в будущем, скажем, например, через 10 минут». –

ответ

28

Этот метод расширения должен делать эту работу:

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.

+0

Обратите внимание, что ToUniversalTime() обрабатывает время с помощью Unspecified Kind как локального, что может быть или не быть правильным для вашего приложения. Вот почему всегда лучше указывать Kind при создании DateTime. См. Http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx –

+0

@Matthew: Да, хорошая точка (хотя не стоит беспокоиться о том, что вы просто используете время относительно Now). Однако вам все равно нужно конвертировать в UTC. – Noldorin

+0

Итак, я наконец-то прочитал ваш код и понял его. Хотел бы я проголосовать за это еще раз. Спасибо :) – UnkwnTech

0

Основной раствор:

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

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

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

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

Конечно, что принимает параметр .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); 
+0

Это нужно сделать в UTC, но в остальном это правильно. – Noldorin

+0

Cheers, обновленный для пояснения –

30

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

Для почти всех практических случаях и при условии, текущее время мимо Unix Epoch вы могли действительно взять

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

Но,

Unix Epoch время определяется как»... система для описания время, определенное как количество секунд, прошедших с полуночи. Скоординированное всеобщее время (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/

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

+1

+1 потому что это интересно, однако, поскольку я работаю по шкале минут (больше всего часов в большинстве случаев), и операции не слишком точны, я не думаю, что 24 секунды чтобы быть большой проблемой, но спасибо за указание на это. – UnkwnTech

+3

Я не думаю, что это правильно. Оба предположения прекрасны (Unix и Windows оба не считают/знают секунды прыжка), но вы делаете неверный вывод, ИМХО. Время Unix игнорирует секунды прыжка, что означает, что «1973-01-01T00: 00: 00Z» - это время Unix 94694400, то есть '(365 + 366 + 365) * 24 * 60 * 60', хотя прошло два прыжковых секунды тем временем. И то же самое верно для Windows. Он знает, что у мастера NTP это '1973-01-01T00: 00: 00Z', но он не знает о двух секундах.Время Unix & Windows - это не непрерывный масштаб времени, но они синхронизированы друг с другом. – Mormegil

+0

Вот почему я сказал «педантично правильно». Мы сравниваем официальное определение времени Unix Epoch, а не практическую реализацию в системе Unix, которая, как вы указываете, находится в той же лодке, что и Windows. –

Смежные вопросы