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

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

Ответ 1

Вы получаете метку времени Unix в С#, используя DateTime.UtcNow и вычитая время epoc 1970-01-01.

например

Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

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

Ответ 2

Начиная с.NET 4.6, существует DateTimeOffset.ToUnixTimeSeconds().


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

Чтобы получить текущую временную метку:

DateTimeOffset.UtcNow.ToUnixTimeSeconds()

Чтобы получить временную метку из DateTime:

DateTime foo = DateTime.UtcNow;
long unixTime = ((DateTimeOffset)foo).ToUnixTimeSeconds();

Ответ 3

Вы также можете использовать Ticks. Я кодирую для 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;

Ответ 4

Это то, что я использую:

public long UnixTimeNow()
{
    var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
    return (long)timeSpan.TotalSeconds;
}

Имейте в виду, что этот метод вернет время как скоординированное универсальное время (UTC).

Ответ 5

Усечение .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);
}

Ответ 6

Когда вы вычитаете 1970 из текущего времени, имейте в виду, что в расписании чаще всего будет поле с нулевым миллисекундом. Если по какой-то причине вас интересует миллисекунды, помните об этом.

Вот что я сделал, чтобы обойти эту проблему.

 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.

Ответ 7

Это то, что я использую.

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

Ответ 8

Это решение помогло мне в моей ситуации:

   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)

Ответ 9

Я объединил самые элегантные подходы к этому утилитарному методу:

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

Ответ 10

В системе DateTimeOffset есть значение ToUnixTimeMilliseconds

Вы можете написать аналогичный метод для DateTime:

public static long ToUnixTimeSeconds(this DateTime value)
{
    return value.Ticks / 10000000L - 62135596800L;
}

10000000L - преобразование тиков в секунды

62135596800L - преобразование с 01.01.01 по 01.01.1978

Нет проблем с Utc и утечками

Ответ 11

Простой код, который я использую:

public static long CurrentTimestamp()
{
   return (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds * 1000);
}

Этот код дает метку времени Unix, общее количество миллисекунд с 1970-01-01 до настоящего времени.