C# 从C中的最小值开始获得秒的浮点值#

C# 从C中的最小值开始获得秒的浮点值#,c#,datetime,C#,Datetime,我正在将Python脚本移植到C# 目前我遇到了使用 time.time() 根据Python文档,此函数调用返回总秒数的浮点值 TimeSpan t = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)); float seconds = (float) t.TotalSeconds; Console.WriteLine (seconds); 以浮点数形式返回

我正在将Python脚本移植到C#

目前我遇到了使用

time.time()
根据Python文档,此函数调用返回总秒数的浮点值

 TimeSpan t = (DateTime.UtcNow - 
               new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc));
 float seconds  = (float) t.TotalSeconds;
 Console.WriteLine (seconds);
以浮点数形式返回时间,以秒为单位 纪元,以UTC为单位。请注意,即使时间总是返回 作为一个浮点数,并不是所有的系统都能提供更好的时间 精度不超过1秒。而此函数通常返回 非递减值,它可以返回比上一个值更低的值 如果两次调用之间的系统时钟已设置回,则调用

我如何从CLR获得相同的信息

Unix上“新纪元”的开始是指1970年1月1日。这是一个相当随意的日期,设置为“足够早”,任何查询该日期后的时间的人都会得到正的秒数

 TimeSpan t = (DateTime.UtcNow - 
               new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc));
 float seconds  = (float) t.TotalSeconds;
 Console.WriteLine (seconds);
来自


我认为在.NET中没有Unix时代的概念,因为Windows不是Unix。然而,
DateTime.Ticks
中有一个类似的概念(来自:

一个刻度代表一百纳秒或一千万分之一秒 一秒钟。一毫秒内有10000个滴答声

此属性的值表示100纳秒数 自0001年1月1日午夜12:00:00以来的间隔, 它表示DateTime.MinValue。它不包括 可归因于闰秒的滴答声


您也可以像其他人建议的那样,在
DateTime
的实例中创建自己的Unix epoch。

对于自epoch(1970年1月1日)以来的秒数,只需按如下方式执行:

DateTime now = DateTime.Now;
TimeSpan t = (now - new DateTime(1970, 1, 1).toLocalTime());
int timestamp = (int) t.TotalSeconds;

与其他类似,但我建议您确保在UTC中使用Unix epoch,如果没有其他内容,请确保其合理性:

private static readonly DateTime UnixEpoch =
    new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

...

TimeSpan timeSinceEpoch = DateTime.UtcNow - UnixEpoch;
double seconds = timeSinceEpoch.TotalSeconds;
(请注意,我将该值保留为一个
double
,因为您显然希望这样做。)

或者,使用:


谢谢你,埃里克。我将把问题标记为已回答。但实际上这将是一个模拟的浮点秒,因为我们将int转换为float。我需要将获得的值与0.350进行比较,因此在我的例子中,我需要使用TickCount计算出相同的值,然后将其转换为秒数。@Maxim:t.TotalSeconds返回一个双精度值,实际上它是用亚秒值填充的。在本例中,我将其转换为
浮点
,因为您的脚本调用了
浮点
。酷,我不知道。再次感谢,说得好,乔恩。我更新了答案以正确设置DateTimeKind。是否将时间提供程序作为注入依赖项?这是非常好的,为了跟上解耦的合成模型。它的目的是否纯粹是提供一个扩展的日期时间操纵功能,如我的案例所需?@MaximV.Pavlov:您的案例不需要任何“扩展”的内容-它很容易被
DateTime
涵盖。Noda Time是使用
DateTime
/
DateTimeOffset
/
TimeZoneInfo
的替代方法。当然,依赖注入业务不需要Noda时间——如果我使用.NET并且需要“当前
DateTime
”,我会将其提取到接口中……这可能是因为您对dep.inj非常熟悉。总共。我已经使用它半年了,到目前为止,我只抽象出逻辑类。我猜开发人员倾向于抽象出的“东西”的范围随着经验而扩大。
// clock would normally be injected, or you could use SystemClock.Instance
Instant instant = clock.Now;
Duration duration = instant - Instant.UnixEpoch;

// Noda Time exposes TotalXyz as long, not double. Go from ticks here
double seconds = ((double) duration.TotalTicks) / NodaConstants.TicksPerSecond;