C# Timestamp.UTCNow不是最新的

C# Timestamp.UTCNow不是最新的,c#,datetime,timestamp,C#,Datetime,Timestamp,我创建了一个获取Unix时间戳的简单类。第一次调用它时,它返回时间戳,但之后它总是返回与第一次返回的值相同的值,就像它已被缓存一样 这是怎么回事 using System; using System.Collections; public class Timestamp { public static float now { get { return (float)(DateTime.UtcNow.Subtract(new DateTim

我创建了一个获取Unix时间戳的简单类。第一次调用它时,它返回时间戳,但之后它总是返回与第一次返回的值相同的值,就像它已被缓存一样

这是怎么回事

using System;
using System.Collections;

public class Timestamp {    
    public static float now {
        get {
            return (float)(DateTime.UtcNow.Subtract(new DateTime (1970, 1, 1))).TotalSeconds;
        }
    }    
}
Timestamp.now始终返回相同的值

编辑:

1) 第一次通话时打印的是2016年8月5日下午11:44:57,第二次通话时打印的是2016年8月5日下午11:45:05,因此它是最新的

2) 第一次通话时打印16929.23:44:57.2918073,第二次通话时打印16929.23:45:05.9735794,因此它是最新的

3) 始终打印1462751000.00

试试这个

public static int now {
        get {
            return (int)(DateTime.UtcNow.Subtract (new DateTime (1970, 1, 1))).TotalSeconds;
        }
    }
问题(正如@PetSerAl在评论中指出的)是
float
的精度太有限

注意:

var nowAsDouble = (DateTime.UtcNow.Subtract(new DateTime (1970, 1, 1))).TotalSeconds;
var nowAsFloat = (float)nowAsDouble;

Console.WriteLine("double: " + nowAsDouble.ToString("0.0"));
Console.WriteLine("float:  " + nowAsFloat.ToString("0.0"));
输出:

如果运行几次,就会看到double版本每次都在更改,其中float值总是被截断


您需要使用
double
值,而不是
float

日期时间的方法
Subract
。UtcNow返回一个
TimeSpan
,您将其强制转换为
浮点值
,这是不正确的。为什么要将结果转换为
浮点值
?@t0mm13b正在强制转换
TotalSeconds
属性的值,该属性的类型为
double
,并且可以在当前Unix时间内转换为
浮点值,
float
类型的分辨率为128秒。您需要等待两分钟以上才能观察到值的变化。@PetSerAl给出了正确的答案。将其更改为“现在加倍”
,并将强制转换为“浮动”,您将观察到值的变化更快。他强制转换了TotalSeconds,这是一个双精度,因此可以强制转换为“浮动”。在投票之前,请各位尝试,尝试一下,当唯一正确的答案被大量否决时,请在“非常悲伤”处检查值,Unix时间戳确实是int。拜托,大家,不要只是假设OP知道他在做什么。他没有。好吧,现在我明白了!最好是使用double并最终将其转换为int(我现在实际上正在这样做),而不是转换为float,因为它会丢失浮点分辨率。
var nowAsDouble = (DateTime.UtcNow.Subtract(new DateTime (1970, 1, 1))).TotalSeconds;
var nowAsFloat = (float)nowAsDouble;

Console.WriteLine("double: " + nowAsDouble.ToString("0.0"));
Console.WriteLine("float:  " + nowAsFloat.ToString("0.0"));
double: 1462751469.2  
float:  1462751000.0