如何将日/月/年日期转换为自0001年1月1日起的.NET风格100ns?

时间:2012-04-08 00:09:31

标签: .net c date time embedded

我正在开发一个嵌入式项目,需要将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单片机。

2 个答案:

答案 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的结果中,乘以将秒转换为刻度,并添加毫秒部分。