日期/日期时间作为包装api中的uint

时间:2016-02-10 11:45:21

标签: c# datetime type-conversion uint

我使用的是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这是有道理但没有成功。 有没有一种已知的方法将日期和时间表示为无符号整数?

2 个答案:

答案 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;
    }