【问题标题】:How to convert day/month/year date to .NET style 100ns ticks since Jan 1, 0001?自 0001 年 1 月 1 日以来,如何将日/月/年日期转换为 .NET 样式的 100ns 刻度?
【发布时间】:2012-04-21 00:15:58
【问题描述】:

我正在处理一个嵌入式项目,需要将 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 微控制器。

【问题讨论】:

  • 有一个名为SystemTimeToFileTime 的 Win32 函数会为您执行此操作(添加常量除外)。你有那个吗?
  • 我正在研究 PIC32MX,所以没有。不过,我应该添加该信息。

标签: .net c date time embedded


【解决方案1】:

使用 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

【讨论】:

  • 我没有一年中的某一天,我有一个月中的某一天。使这个解决方案有点不方便,但仍然有效。
  • 将月中的一天转换为一年中的一天不是典型的介绍性编程练习吗?还是在 90 年代过时了? :-)
【解决方案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 的结果中,乘以将秒转换为滴答声,然后添加毫秒部分。

【讨论】:

  • mktime 是有问题的,因为它适用于当地时间,而不是通用时间。
  • 我正在制作图片,这会注意到其中的区别吗?明天将对此进行测试以检查,但我猜它无法知道它所在的时区。
猜你喜欢
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 2015-04-29
  • 1970-01-01
  • 2017-01-09
相关资源
最近更新 更多