Как получить метку времени unix в C#
Я осмотрел stackoverflow и даже посмотрел на некоторые из предложенных вопросов, и ни один из них, похоже, не отвечает, как вы получаете временную метку unix в C#?
9 ответов:
вы получаете метку времени unix в C# с помощью DateTime.UtcNow и вычитание времени epoc 1970-01-01.
например
Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
DateTime.Now
может быть заменен на любой другойDateTime
объект, для которого вы хотели бы получить метку времени unix.
по состоянию на .NET 4.6, есть
DateTimeOffset.ToUnixTimeSeconds()
.
это метод экземпляра, так что вы должны вызвать его на экземпляр
DateTimeOffset
. Вы также можете привести любой экземплярDateTime
, хотя остерегайтесь часовой пояс.чтобы получить текущую метку времени:
DateTimeOffset.UtcNow.ToUnixTimeSeconds()
чтобы получить метку времени с
DateTime
:DateTime foo = DateTime.UtcNow; long unixTime = ((DateTimeOffset)foo).ToUnixTimeSeconds();
вы также можете использовать клещи. Я кодирую для Windows Mobile, поэтому не имею полного набора методов. TotalSeconds не доступен для меня.
long epochTicks = new DateTime(1970, 1, 1).Ticks; long unixTime = ((DateTime.UtcNow.Ticks - epochTicks) / TimeSpan.TicksPerSecond);
или
TimeSpan epochTicks = new TimeSpan(new DateTime(1970, 1, 1).Ticks); TimeSpan unixTicks = new TimeSpan(DateTime.UtcNow.Ticks) - epochTicks; double unixTime = unixTicks.TotalSeconds;
вот что я использую:
public long UnixTimeNow() { var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)); return (long)timeSpan.TotalSeconds; }
имейте в виду, что этот метод вернет время как координированное универсальное время (UTC).
усек
.TotalSeconds
важно, так как он определяется какthe value of the current System.TimeSpan structure expressed in whole fractional seconds.
А как насчет продления
DateTime
? Второй, вероятно, более запутан, что он стоит до тех пор, пока не появятся расширения свойств./// <summary> /// Converts a given DateTime into a Unix timestamp /// </summary> /// <param name="value">Any DateTime</param> /// <returns>The given DateTime in Unix timestamp format</returns> public static int ToUnixTimestamp(this DateTime value) { return (int)Math.Truncate((value.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds); } /// <summary> /// Gets a Unix timestamp representing the current moment /// </summary> /// <param name="ignored">Parameter ignored</param> /// <returns>Now expressed as a Unix timestamp</returns> public static int UnixTimestamp(this DateTime ignored) { return (int)Math.Truncate((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds); }
когда вы вычитаете 1970 из текущего времени, имейте в виду, что timespan чаще всего будет иметь ненулевое поле миллисекунд. Если по какой-то причине вас интересуют миллисекунды, имейте это в виду.
вот что я сделал, чтобы обойти эту проблему.
DateTime now = UtcNow(); // milliseconds Not included. DateTime nowToTheSecond = new DateTime(now.Year,now.Month,now.Day,now.Hour,now.Minute,now.Second); TimeSpan span = (date - new DateTime(1970, 1, 1, 0, 0, 0, 0)); Assert.That(span.Milliseconds, Is.EqualTo(0)); // passes.
Это то, что я использую.
public class TimeStamp { public Int32 UnixTimeStampUTC() { Int32 unixTimeStamp; DateTime currentTime = DateTime.Now; DateTime zuluTime = currentTime.ToUniversalTime(); DateTime unixEpoch = new DateTime(1970, 1, 1); unixTimeStamp = (Int32)(zuluTime.Subtract(unixEpoch)).TotalSeconds; return unixTimeStamp; } }
данное решение помогло в моей ситуации:
public class DateHelper { public static double DateTimeToUnixTimestamp(DateTime dateTime) { return (TimeZoneInfo.ConvertTimeToUtc(dateTime) - new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc)).TotalSeconds; } }
использование помощника в коде:
double ret = DateHelper.DateTimeToUnixTimestamp(DateTime.Now)
Я объединил самые элегантные подходы к этому методу утилиты:
public static class Ux { public static decimal ToUnixTimestampSecs(this DateTime date) => ToUnixTimestampTicks(date) / (decimal) TimeSpan.TicksPerSecond; public static long ToUnixTimestampTicks(this DateTime date) => date.ToUniversalTime().Ticks - UnixEpochTicks; private static readonly long UnixEpochTicks = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks; }