1

我正在开发一个嵌入式项目,需要将 DDMMYY 日期和 HHMMSSmmm 时间转换为自 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 微控制器。

4

2 回答 2

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

于 2012-04-08T00:22:43.023 回答
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 的结果中,乘以将秒转换为滴答声,然后添加毫秒部分。

于 2012-04-08T00:17:24.853 回答