我使用的是C ++ api的包装器,它没有真正记录。一些公开的方法需要uint类型的字段(from和to)。这些字段实际上是datefrom和dateto,但类型不是这样的。我尝试了不同的方法,包括将datetime转换为DOS unsigned int表示
public ushort ToDosDateTime( DateTime dateTime)
{
uint day = (uint)dateTime.Day; // Between 1 and 31
uint month = (uint)dateTime.Month; // Between 1 and 12
uint years = (uint)(dateTime.Year - 1980); // From 1980
if (years > 127)
throw new ArgumentOutOfRangeException("Cannot represent the year.");
uint dosDateTime = 0;
dosDateTime |= day << (16 - 16);
dosDateTime |= month << (21 - 16);
dosDateTime |= years << (25 - 16);
return unchecked((ushort)dosDateTime);
}
,但是如果没有错误,api函数调用仍然没有返回任何内容。 ,我也试过简单的表示:20160101这是有道理但没有成功。 有没有一种已知的方法将日期和时间表示为无符号整数?
答案 0 :(得分:1)
.NET本身将DateTime
存储为无符号长整数,代表1/1/0001的刻度。来自reference source:
// The data is stored as an unsigned 64-bit integeter
// Bits 01-62: The value of 100-nanosecond ticks where 0 represents 1/1/0001 12:00am, up until the value
// 12/31/9999 23:59:59.9999999
// Bits 63-64: A four-state value that describes the DateTimeKind value of the date time, with a 2nd
// value for the rare case where the date time is local, but is in an overlapped daylight
// savings time hour and it is in daylight savings time. This allows distinction of these
// otherwise ambiguous local times and prevents data loss when round tripping from Local to
// UTC time.
private UInt64 dateData;
另外,UNIX存储时间稍有不同。根据{{3}}:
定义为自1970年1月1日星期四00:00:00协调世界时(UTC)以来经过的秒数
因此可以非常容易地用无符号整数表示。您可以将其转换为DateTime
Wikipedia。
答案 1 :(得分:1)
我创建了这个函数,我在测试日期中测试了我作为uint的API。
public DateTime FromCtmToDateTime(uint dateTime)
{
DateTime startTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
return startTime.AddSeconds(Convert.ToDouble( dateTime));
}
@ChrisF:我试过这个并且有效。 这确实是C时间,这意味着开始日期是1970年午夜 - 1 -1; uint表示自该日期以来的秒数。
我通过处理从工作函数获得的输出日期成功获得了有意义的日期,并使用以下内容进行转换:
public UInt32 ToDosDateTime( DateTime dateTime)
{
DateTime startTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
TimeSpan currTime = dateTime - startTime;
UInt32 time_t = Convert.ToUInt32(Math.Abs(currTime.TotalSeconds));
return time_t;
}