Как получить метку времени 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;
}