.NET DateTime以time_t为单位

有C代码:

time1=((double)dt1-25569.0)*86400.0; 

它在几秒钟内从TDateTime(VCL)转换为time_t格式,所以最后我需要从.NET DateTime获取time_t格式

关于time_t:

几乎普遍期望它是表示自UTC时间1970年1月1日00:00以来经过的秒数的积分值。 这是由于历史原因,因为它对应于unix时间戳,但是在所有平台的C库中广泛实现。

所以要在.NET中获得秒数我正在做这个(F#):

 let seconds(dt : DateTime) = (dt.Ticks/10000000L) 

或者在C#上(使用更流行的C#标签):

 Int64 seonds(DateTime dt) { return (dt.Ticks/ ((Int64)10000000)); } // hope it works, but please correct if I mistaken 

据我所知,它是从0001 UTC 1月1日12:00:00开始的时间。

因此,要使用time_t格式,我需要在几秒钟内添加1970年。

所以最终函数必须是(F#):

 let seconds(dt : DateTime) = (dt.Ticks/10000000L) + 31536000*1970 

C# :

 Int64 seonds(DateTime dt) { return (dt.Ticks/ ((Int64)10000000)) + 31536000*1970; } 

我真的害怕我在这里弄错了。 请检查这个解决方案! (检查这是否正确)

谢谢

这看起来有点整洁? 如果您将大量使用它,您可以使纪元成为静态日期时间。

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

我建议使用以下代码。 它似乎更好地传达了代码的含义

 private static readonly DateTime REFERENCE = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); Int64 seconds(DateTime dt) { return (dt - REFERENCE).TotalSeconds; } 

在C#中:

 Int64 Secs(DateTime dt) { var delta = dt - new DateTime(1970, 1, 1); return Convert.ToInt64(delta.TotalSeconds); } 

在阅读@ jheriko对已接受答案的评论之后,我写了一个快速控制台应用程序来测试msvcrt.dll中的time()是否会产生不同的结果,使用托管日期/时间函数进行计算,幸运的是, 如果使用UTC ,它们就没有。 一般而言,应尽可能使用UTC计算日期和时间,并将其作为公共基准存储在UTC中,然后根据需要转换回相关时区进行显示。

作为参考,并说明到达1970年1月1日至今之间的秒数的不同方式,我的测试代码是:

 class Program { [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] public unsafe static extern int time(int* timer); static unsafe void Main(string[] args) { DateTime now = DateTime.Now; DateTime utc_now = DateTime.UtcNow; int time_t_msvcrt = time(null); int time_t_managed = (int)Math.Floor((now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds); int time_t_managed_2 = (int)Math.Floor((utc_now - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds); Console.WriteLine(time_t_msvcrt == time_t_managed); Console.WriteLine(time_t_msvcrt == time_t_managed_2); DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); DateTime time_t_now = epoch.Add(TimeSpan.FromSeconds(time_t_msvcrt)); long now_secs = now.Ticks / 10000000L; long utc_now_secs = utc_now.Ticks / 10000000L; long time_t_now_secs = time_t_now.Ticks / 10000000L; Console.WriteLine(time_t_now_secs == now_secs); Console.WriteLine(time_t_now_secs == utc_now_secs); Console.ReadLine(); } } 

这会产生输出

 True True True True 

正如所料。