C# Timestamp.UTCNow不是最新的
我创建了一个获取Unix时间戳的简单类。第一次调用它时,它返回时间戳,但之后它总是返回与第一次返回的值相同的值,就像它已被缓存一样 这是怎么回事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
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