如何在C#中获取unix时间戳

时间:2013-07-13 17:33:26

标签: c# timestamp unix-timestamp

我已经浏览过stackoverflow,甚至看了一些建议的问题,似乎没有人回答,你如何在C#中获得unix时间戳?

14 个答案:

答案 0 :(得分:510)

通过使用DateTime.UtcNow并减去1970-01-01的epoc时间,您可以在C#中获得unix时间戳。

e.g。

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

DateTime.Now可以替换为您希望获取unix时间戳的任何DateTime对象。

答案 1 :(得分:386)

从.NET 4.6开始,有DateTimeOffset.ToUnixTimeSeconds()

这是一个实例方法,因此您需要在DateTimeOffset的实例上调用它。您也可以投射DateTime的任何实例,但beware the timezone

获取当前时间戳:

DateTimeOffset.UtcNow.ToUnixTimeSeconds()

DateTime获取时间戳:

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

答案 2 :(得分:37)

您也可以使用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;

答案 3 :(得分:24)

这就是我使用的:

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

请记住,此方法会将时间作为协调通用时间(UTC)返回。

答案 4 :(得分:18)

截断.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);
}

答案 5 :(得分: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.

答案 6 :(得分:5)

这就是我使用的。

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

答案 7 :(得分:4)

更新了 Brad 的代码,其中包含一些内容: 您不需要 Math.truncate,转换为 int 或 long 会自动截断值。 在我的版本中,我使用 long 而不是 int(我们将在 2038 年用完 32 位有符号整数)。 此外,添加了时间戳解析。

public static class DateTimeHelper
{
    /// <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 long ToUnixTimestamp(this DateTime value)
    {
        return (long)(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 long UnixTimestamp(this DateTime ignored)
    {
        return (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
    }

    /// <summary>
    /// Returns a local DateTime based on provided unix timestamp
    /// </summary>
    /// <param name="timestamp">Unix/posix timestamp</param>
    /// <returns>Local datetime</returns>
    public static DateTime ParseUnixTimestamp(long timestamp)
    {
        return (new DateTime(1970, 1, 1)).AddSeconds(timestamp).ToLocalTime();
    }

}

答案 8 :(得分:2)

这个解决方案在我的情况下有所帮助:

   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 :(得分:2)

我把这种实用方法最优雅的方法拼凑在一起:

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 :(得分:1)

下面是一个2向扩展类,它支持:

  • 时区本地化
  • 输入\输出(以秒或毫秒为单位)。

在OP的情况下,用法为:

DateTime.Now.ToUnixtime();

DateTime.UtcNow.ToUnixtime();

即使存在直接答案,我相信使用通用方法会更好。 特别是因为最有可能需要这样的转换的项目,无论如何也将需要这些扩展,因此最好对所有人使用相同的工具。

    public static class UnixtimeExtensions
    {
        public static readonly DateTime UNIXTIME_ZERO_POINT = new DateTime(1970, 1, 1, 0, 0,0, DateTimeKind.Utc);

        /// <summary>
        /// Converts a Unix timestamp (UTC timezone by definition) into a DateTime object
        /// </summary>
        /// <param name="value">An input of Unix timestamp in seconds or milliseconds format</param>
        /// <param name="localize">should output be localized or remain in UTC timezone?</param>
        /// <param name="isInMilliseconds">Is input in milliseconds or seconds?</param>
        /// <returns></returns>
        public static DateTime FromUnixtime(this long value, bool localize = false, bool isInMilliseconds = true)
        {
            DateTime result;

            if (isInMilliseconds)
            {
                result = UNIXTIME_ZERO_POINT.AddMilliseconds(value);
            }
            else
            {
                result = UNIXTIME_ZERO_POINT.AddSeconds(value);
            }

            if (localize)
                return result.ToLocalTime();
            else
                return result;
        }

        /// <summary>
        /// Converts a DateTime object into a Unix time stamp
        /// </summary>
        /// <param name="value">any DateTime object as input</param>
        /// <param name="isInMilliseconds">Should output be in milliseconds or seconds?</param>
        /// <returns></returns>
        public static long ToUnixtime(this DateTime value, bool isInMilliseconds = true)
        {
            if (isInMilliseconds)
            {
                return (long)value.ToUniversalTime().Subtract(UNIXTIME_ZERO_POINT).TotalMilliseconds;
            }
            else
            {
                return (long)value.ToUniversalTime().Subtract(UNIXTIME_ZERO_POINT).TotalSeconds;
            }
        }
    }

答案 11 :(得分:0)

系统中的DateTimeOffset有一个ToUnixTimeMilliseconds

您可以为DateTime编写类似的方法:

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

10000000L-将刻度转换为秒

62135596800L-将01.01.01转换为1978年1月1日

Utc和泄漏没有问题

答案 12 :(得分:0)

我在挣扎了一段时间后使用了它,它也可以满足时区偏移:

    public double Convert_DatTime_To_UNIXDATETIME(DateTime dt)
    {
        System.DateTime from_date = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
        double unix_time_since = dt.Subtract(from_date).TotalMilliseconds;

        TimeSpan ts_offset = TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow);

        double offset = ts_offset.TotalMilliseconds;

        return unix_time_since - offset;
    }

答案 13 :(得分:-1)

我正在使用的简单代码:

step([$class: 'ConsulKVBuilder', aclToken: '', apiUri: '', debugMode: 'DISABLED', envVarKey: 'env_status', hostUrl: '', key: "env_status/${env_name}", keyValue: "{    \"owr\":\"${owr}\",    \"de\":\"${de}\",    \"tct\":\"${tct}\",    \"shutdown_date\": \"${shutdown_date}\",    \"termination_date\": \"${termination_date}\" }", requestMode: 'WRITE'])

此代码提供了从 1970-01-01 到现在的unix时间戳,总计毫秒。