2012-04-08 193 views
1

我工作的一个嵌入式项目,需要一个DDMMYY日期和时间HHMMSSmmm转换为.NET风格100ns ticks since Jan 1, 0001.如何将日/月/年日期转换为自0001年1月1日以来.NET样式100ns的勾号?

我已经分解到年,月,日,小时,第二,分钟,毫秒值,像这样:

//DDMMYY 
year = Date.Val % 100 + 2000;//Year 
month = (Date.Val/100) % 100;//JAN = 1, FEB = 2, etc 
day = (Date.Val/10000) % 100;//day of the month 
//HHMMSSmmm 
millisecond = (UTCTime.Val % 1000); 
second =  (UTCTime.Val/1000) % 100; 
minute =  (UTCTime.Val/100000) % 100; 
hour =   (UTCTime.Val/10000000) % 100; 

我现在需要的是把这些价值观和做嵌入式C相当于此问题的方法:

DateTime date = new DateTime(2012, 4, 7, 7, 5, 23, 205); 
long ticks1 = date.Ticks; 

编辑
我正在使用PIC32单片机。

+0

有称为['SystemTimeToFileTime'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms724948(V A Win32函数= VS。 85).aspx)它会为你做这件事(除了添加一个常量)。你有这些吗? – 2012-04-08 00:16:10

+0

我正在PIC32MX上工作,所以没有。我应该添加该信息。 – CodeFusionMobile 2012-04-08 01:17:34

回答

2

我认为你可以用标准C使用mktime来做到这一点。首先,把你的价值观为struct tm

struct tm { 
    int tm_sec;   /* seconds */ 
    int tm_min;   /* minutes */ 
    int tm_hour;  /* hours */ 
    int tm_mday;  /* day of the month */ 
    int tm_mon;   /* month */ 
    int tm_year;  /* year */ 
    int tm_wday;  /* day of the week */ 
    int tm_yday;  /* day in the year */ 
    int tm_isdst;  /* daylight saving time */ 
}; 

可以忽略wday和yday,但应该isdst设置为-1(详细内容请阅读手册页)。然后,打电话给mktime(),它会给你1970年以来的秒数。然后,使用任何必要的方法,例如一个简单的一次性C#程序,计算出Microsoft时代与Unix时代之间的秒数。这是一个不可改变的值,您应该将其硬编码到您的C程序中。将其添加到mktime的结果中,乘以将秒转换为滴答,并添加毫秒部分。

+1

'mktime'有问题,因为它在当地时间运行,而不是通用时间。 – 2012-04-08 00:23:11

+0

我正在研究PIC,是否会注意到差异?明天将测试这个检查,但我猜测它没有办法知道它是在什么时区。 – CodeFusionMobile 2012-04-08 04:11:30

3

正确的时代开始,使用POSIX指定的公式,然后将其调整为正确历元和“.NET时期”之间的秒数,并在100-ns-tick上添加零件。

tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 + 
    (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 - 
    ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400 

来源:http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15

+0

我没有今年的一天,我有一天的一天。使这个解决方案有点不方便,但仍然有效。 – CodeFusionMobile 2012-04-08 02:50:35

+0

是不是将每月的日历转换为典型的入门编程练习?还是在九十年代流行呢? :-) – 2012-04-08 03:49:19

相关问题