CSharp - 如何将UNIX时间戳转换为DateTime或者相反?

  显示原文与译文双语对照的内容

有这个示例代码,但是它开始谈论毫秒/纳秒问题。

在MSDN上也有同样的问题:

http://blogs.msdn.com/brada/archive/2004/03/20/93332. aspx

这是我目前得到的信息:


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

时间:

以下是你需要的内容:


public static DateTime UnixTimeStampToDateTime( double unixTimeStamp )
{
//Unix timestamp is seconds past epoch
 System.DateTime dtDateTime = new DateTime(1970,1,1,0,0,0,0,System.DateTimeKind.Utc);
 dtDateTime = dtDateTime.AddSeconds( unixTimeStamp ).ToLocalTime();
 return dtDateTime;
}

或者,对于 Java ( 这是不同的):


public static DateTime JavaTimeStampToDateTime(double javaTimeStamp)
{
//Java timestamp is millisecods past epoch
 System.DateTime dtDateTime = new DateTime(1970,1,1,0,0,0,0,System.DateTimeKind.Utc);
 dtDateTime = dtDateTime.AddSeconds(Math.Round(javaTimeStamp/1000)).ToLocalTime();
 return dtDateTime;
}

日期时间到UNIX时间戳:


public static double DateTimeToUnixTimestamp(DateTime dateTime)
{
 return (dateTime - new DateTime(1970, 1, 1).ToLocalTime()).TotalSeconds;
}

"UTC不随季节变化而变化,但如果时区管辖权遵守夏时制时间( 夏季时间),则本地时间或者民用时间可能发生变化。 例如UTC是领先于( 也就是说,在一天的晚些时候) 5小时本地时间在美国的东海岸,冬天,但 4小时日光节约时前面是观察到在那里。"

这就是我的代码:


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

的下一个版本. NET ( v4.6 ) 正在添加对Unix时间转换的内置支持。 既在Unix时间表示为秒或者对 and. milliseconds,,也令人

  • DateTimeOffset 以秒为单位的Unix时间:

DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000);

  • DateTimeOffset 到Unix时间以秒为单位:

long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds();

  • DateTimeOffset的Unix时间以毫秒为单位:

DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000);

  • DateTimeOffset 到Unix时间以毫秒为单位:

long unixTimeStampInMilliseconds= dateTimeOffset.ToUnixTimeMilliseconds();


注意:这些方法转换为 DateTimeOffset 。 要获取 DateTime 表达式,只需使用 DateTimeOffset.DateTime 属性:


DateTime dateTime = dateTimeOffset.DateTime;

为了补充scottcher的回答,我最近发现自己在讨厌的场景中,在一个输入数据集中随机地将UNIX时间戳和毫秒时间混合在一起。 下面的代码似乎处理了以下问题:


static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
static readonly double MaxUnixSeconds = (DateTime.MaxValue - UnixEpoch).TotalSeconds;

public static DateTime UnixTimeStampToDateTime(double unixTimeStamp)
{
 return unixTimeStamp> MaxUnixSeconds
? UnixEpoch.AddMilliseconds(unixTimeStamp)
 : UnixEpoch.AddSeconds(unixTimeStamp);
}

我找到了正确的答案,只是比较了 1/1/1970/o的本地时间调整;


DateTime date = new DateTime(2011, 4, 1, 12, 0, 0, 0);
DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0);
TimeSpan span = (date - epoch);
double unixTime =span.TotalSeconds;

我需要将包含 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);
}


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

小心AddSeconds和AddMilliseconds截断了double中的微秒。 这些版本精度高。

磅的Unix -> 日期时间


public static DateTime UnixTimestampToDateTime(double unixTime)
{
 DateTime unixStart = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
 long unixTimeStampInTicks = (long) (unixTime * TimeSpan.TicksPerSecond);
 return new DateTime(unixStart.Ticks + unixTimeStampInTicks);
}

日期时间-> Unix


public static double DateTimeToUnixTimestamp(DateTime dateTime)
{
 DateTime unixStart = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
 long unixTimeStampInTicks = (dateTime.ToUniversalTime() - unixStart).Ticks;
 return (double) unixTimeStampInTicks/TimeSpan.TicksPerSecond;
}

...