我正在开发一个嵌入式项目,需要将DDMMYY日期和HHMMSSmmm时间转换为.NET样式100ns ticks since Jan 1, 0001.
我将值分为年,月,日,小时,秒,分钟,毫秒,如下:
//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 :(得分: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
答案 1 :(得分:2)
我认为你可以使用mktime只使用标准C来实现。首先,将您的值放入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的结果中,乘以将秒转换为刻度,并添加毫秒部分。