Как получить метку времени unix в C#


Я осмотрел stackoverflow и даже посмотрел на некоторые из предложенных вопросов, и ни один из них, похоже, не отвечает, как вы получаете временную метку unix в C#?

9 253

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;
}