. 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:
为了在。net中获得秒数,我这样做(f#):通常被认为是一个整数值,表示从UTC时间1970年1月1日00:00开始经过的秒数。这是由于历史原因,因为它对应一个Unix时间戳,但在所有C库中广泛实现平台。
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; }
我真担心我在这里弄错了。请检查此解决方案!(检查是否正确)
谢谢
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
。