Я просмотрел stackoverflow и даже посмотрел на некоторые из предложенных вопросов, и никто, кажется, не ответил, как вы получаете временную метку unix на С#?
Как получить временную метку 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 до настоящего времени.