Получите количество секунд с минимума в C # - PullRequest
2 голосов
/ 01 марта 2012

Я портирую скрипт Python на C #.

В настоящее время я сталкивался с кодом, который использует

time.time()

В соответствии с документацией Python этот вызов функции возвращает число операций с общим числом секунд.время как число с плавающей запятой, выраженное в секундах с начала эпохи в UTC.Обратите внимание, что, хотя время всегда возвращается как число с плавающей запятой, не все системы предоставляют время с большей точностью, чем 1 секунда.Хотя эта функция обычно возвращает неубывающие значения, она может вернуть более низкое значение, чем предыдущий вызов, если системные часы были установлены обратно между двумя вызовами.?

Ответы [ 5 ]

4 голосов
/ 01 марта 2012

Начало «эпохи» в Unix относится к 1 января 1970 года. Это довольно произвольная дата, установленная как «достаточно ранняя», чтобы любой, кто запрашивает время с этой даты, получал положительное количество секунд.

 TimeSpan t = (DateTime.UtcNow - 
               new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc));
 float seconds  = (float) t.TotalSeconds;
 Console.WriteLine (seconds);

http://blogs.msdn.com/b/brada/archive/2004/03/20/93332.aspx

3 голосов
/ 01 марта 2012

Аналогично другим, но я бы посоветовал вам использовать эпоху Unix в UTC , для здравомыслия, если ничего больше:

private static readonly DateTime UnixEpoch =
    new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

...

TimeSpan timeSinceEpoch = DateTime.UtcNow - UnixEpoch;
double seconds = timeSinceEpoch.TotalSeconds;

(Обратите внимание, что я сохранил значение как double, учитывая, что вы, очевидно, хотите его таким образом.)

В качестве альтернативы, используя Noda Time :

// clock would normally be injected, or you could use SystemClock.Instance
Instant instant = clock.Now;
Duration duration = instant - Instant.UnixEpoch;

// Noda Time exposes TotalXyz as long, not double. Go from ticks here
double seconds = ((double) duration.TotalTicks) / NodaConstants.TicksPerSecond;
1 голос
/ 01 марта 2012

В течение количества секунд с начала эпохи (1 января 1970 г.), просто сделайте это так:

DateTime now = DateTime.Now;
TimeSpan t = (now - new DateTime(1970, 1, 1).toLocalTime());
int timestamp = (int) t.TotalSeconds;
1 голос
/ 01 марта 2012

Я не думаю, что существует концепция эпохи Unix в .NET, потому что Windows не является Unix. Однако в DateTime.Ticks (из документов ) есть аналогичная концепция:

Один тик представляет сто наносекунд или одну десятую миллионную секунды. В миллисекунде 10 000 тиков.

Значение этого свойства представляет число 100 наносекунд интервалы, прошедшие с 12:00:00 до полуночи 1 января 0001 г. который представляет DateTime.MinValue. Не включает количество тики, которые относятся к високосным секундам.

Вы также можете создать свою собственную эпоху Unix в экземпляре DateTime, как предлагали другие.

0 голосов
/ 01 марта 2012

от http://blogs.msdn.com/b/brada/archive/2004/03/20/93332.aspx

TimeSpan t = (DateTime.UtcNow - new DateTime(1970, 1, 1));
 int timestamp  = (int) t.TotalSeconds;
 Console.WriteLine (timestamp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...