[c#] 我如何將Unix時間戳轉換為DateTime,反之亦然?


Answers

最新版本的.NET(v4.6)增加了對Unix時間轉換的內置支持。 這包括來自和來自Unix時間的時間,以秒或毫秒錶示。

  • Unix時間在幾秒鐘內到DateTimeOffset

DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000);
  • 以秒為單位的DateTimeOffset到Unix時間:

long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds();
  • Unix時間以毫秒為單位DateTimeOffset

DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000);
  • Unix時間的DateTimeOffset以毫秒為單位:

long unixTimeStampInMilliseconds= dateTimeOffset.ToUnixTimeMilliseconds();

注意:這些方法轉換為和來自DateTimeOffset 。 要獲取DateTime表示,只需使用DateTimeOffset.DateTime屬性:

DateTime dateTime = dateTimeOffset.UtcDateTime;
Question

有這個示例代碼,但它開始談論毫秒/納秒問題。

自從C#中的Unix時代開始, MSDN上就出現了同樣的問題。

這是我到目前為止:

public Double CreatedEpoch
{
  get
  {
    DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime();
    TimeSpan span = (this.Created.ToLocalTime() - epoch);
    return span.TotalSeconds;
  }
  set
  {
    DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime();
    this.Created = epoch.AddSeconds(value);
  }
}



DateTime unixEpoch = DateTime.ParseExact("1970-01-01", "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture);
DateTime convertedTime = unixEpoch.AddMilliseconds(unixTimeInMillisconds);

當然,可以讓unixEpoch成為全局靜態的,所以它只需要在你的項目中出現一次,如果UNIX時間在幾秒鐘內就可以使用AddSeconds

走另一條路:

double unixTimeInMilliseconds = timeToConvert.Subtract(unixEpoch).TotalMilliseconds;

截斷到Int64和/或根據需要使用TotalSeconds




“UTC不會隨著季節的變化而變化,但如果時區管轄區遵守夏令時(夏令時),則本地時間或民用時間可能會發生變化。例如,UTC比提前5小時(即當天晚些時候比當地時間冬季美國東海岸的時間要晚4個小時,而在那裡觀察夏令時。“

所以這是我的代碼:

TimeSpan span = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0,DateTimeKind.Utc));
double unixTime = span.TotalSeconds;



Unix時間轉換在.NET Framework 4.6中是新的。

現在,您可以更輕鬆地將日期和時間值轉換為.NET Framework類型和Unix時間。 例如,在JavaScript客戶端和.NET服務器之間轉換時間值時,這可能是必需的。 以下API已添加到DateTimeOffset結構中

static DateTimeOffset FromUnixTimeSeconds(long seconds)
static DateTimeOffset FromUnixTimeMilliseconds(long milliseconds)
long DateTimeOffset.ToUnixTimeSeconds()
long DateTimeOffset.ToUnixTimeMilliseconds()



請參閱IdentityModel.EpochTimeExtensions

public static class EpochTimeExtensions
{
    /// <summary>
    /// Converts the given date value to epoch time.
    /// </summary>
    public static long ToEpochTime(this DateTime dateTime)
    {
        var date = dateTime.ToUniversalTime();
        var ticks = date.Ticks - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).Ticks;
        var ts = ticks / TimeSpan.TicksPerSecond;
        return ts;
    }

    /// <summary>
    /// Converts the given date value to epoch time.
    /// </summary>
    public static long ToEpochTime(this DateTimeOffset dateTime)
    {
        var date = dateTime.ToUniversalTime();
        var ticks = date.Ticks - new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero).Ticks;
        var ts = ticks / TimeSpan.TicksPerSecond;
        return ts;
    }

    /// <summary>
    /// Converts the given epoch time to a <see cref="DateTime"/> with <see cref="DateTimeKind.Utc"/> kind.
    /// </summary>
    public static DateTime ToDateTimeFromEpoch(this long intDate)
    {
        var timeInTicks = intDate * TimeSpan.TicksPerSecond;
        return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddTicks(timeInTicks);
    }

    /// <summary>
    /// Converts the given epoch time to a UTC <see cref="DateTimeOffset"/>.
    /// </summary>
    public static DateTimeOffset ToDateTimeOffsetFromEpoch(this long intDate)
    {
        var timeInTicks = intDate * TimeSpan.TicksPerSecond;
        return new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero).AddTicks(timeInTicks);
    }
}



我需要將包含UNIX timetimeval結構 (秒,微秒)轉換為DateTime而不會丟失精度,並且在這裡沒有找到答案,所以我想我可能會添加我的:

DateTime _epochTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private DateTime UnixTimeToDateTime(Timeval unixTime)
{
    return _epochTime.AddTicks(
        unixTime.Seconds * TimeSpan.TicksPerSecond +
        unixTime.Microseconds * TimeSpan.TicksPerMillisecond/1000);
}



Links