. net DateTime到time_t,以秒为单位

本文关键字:为单位 DateTime time net | 更新日期: 2023-09-27 18:06:49

有C代码:

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

它的转换从TDateTime (VCL)到time_t格式在秒,所以最后我需要得到time_t格式从。net DateTime

about 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

据我所知,时间从12:00:00 Jan 1, 0001 UTC。

要使用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; } 
我真担心我在这里弄错了。请检查此解决方案!(检查是否正确)

谢谢

. net DateTime到time_t,以秒为单位

try

 (dt - new DateTime (1970, 1, 1)).TotalSeconds

看到

  • http://msdn.microsoft.com/en-us/library/system.timespan.totalseconds.aspx
  • http://msdn.microsoft.com/en-us/library/xcfzdy4x.aspx

看起来更整洁了吗?如果您将经常使用epoch,您可以将它设置为静态日期时间。

DateTime date = DateTime.Now;
DateTime epoch = new DateTime(1970, 1, 1);
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作为通用基准来计算和存储,然后在必要时转换回相应的时区以供显示。

作为参考,并且为了说明从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