.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; }
我真的害怕我在这里弄错了。 请检查这个解决方案! (检查这是否正确)
谢谢
尝试
(dt - new DateTime (1970, 1, 1)).TotalSeconds
看到
这看起来有点整洁? 如果您将大量使用它,您可以使纪元成为静态日期时间。
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
正如所料。
上述就是C#学习教程:.NET DateTime以time_t为单位分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/987654.html