我正在尝试将C#DateTime变量转换为Unix时间,即自1970年1月1日以来的秒数。看起来DateTime实际上是自0001年1月1日以来的“滴答”数量。
我目前的想法是从我的DateTime中减去1970年1月1日这样:
TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0));
return span.TotalSeconds;
有更好的方法吗?
答案 0 :(得分:173)
基本上就是这样。这些是我用来转换为Unix纪元时间的方法:
public static DateTime ConvertFromUnixTimestamp(double timestamp)
{
DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
return origin.AddSeconds(timestamp);
}
public static double ConvertToUnixTimestamp(DateTime date)
{
DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
TimeSpan diff = date.ToUniversalTime() - origin;
return Math.Floor(diff.TotalSeconds);
}
答案 1 :(得分:37)
如果系统的其余部分使用DateTimeOffset而不是DateTime,那么这是一个非常方便的功能:
long unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds();
答案 2 :(得分:22)
我唯一看到的是它应该是自1970年1月1日午夜以来 UTC
TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc));
return span.TotalSeconds;
答案 3 :(得分:14)
您可能希望使用DateTime.UtcNow来避免时区问题
TimeSpan span= DateTime.UtcNow.Subtract(new DateTime(1970,1,1,0,0,0));
答案 4 :(得分:1)
如果所讨论的日期时间是UTC,那么这种方法会很好,或者表示从未观察过夏令时的区域中的当地时间。 DateTime差异例程没有考虑夏令时,因此将6月1日午夜视为1月1日午夜后24小时的倍数。我不知道Windows中报告当前历史日光节约规则的任何内容locale,所以我认为没有任何好的方法可以在最近的夏令时规则更改之前的任何时间正确处理。
答案 5 :(得分:1)
我在微积分中使用2000年而不是大纪元。使用较小的数字易于存储和传输,并且对JSON友好。
2000年是946684800秒。
2000年是从0001年1月1日开始的第二个63082281600。
DateTime.UtcNow计时从0001年1月1日开始
从2000年开始的第二次:
DateTime.UtcNow.Ticks/10000000-63082281600
Unix时间的第二秒:
DateTime.UtcNow.Ticks/10000000-946684800
例如2020年是
var year2020 =(new DateTime())。AddYears(2019).Ticks; //因为DateTime已经从第1年开始
637134336000000000从0001年1月1日开始滴答滴答
63713433600自0001年1月1日以来的秒数
距纪元1577836800秒
631152000 自2000年以来的秒数
参考:
Epoch时间转换器:https://www.epochconverter.com
答案 6 :(得分:0)
您可以创建DateTime的startTime和endTime,然后执行endTime.Subtract(startTime)。然后输出你的span.Seconds。
我认为这应该有用。