This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Compiler/TM4C1231H6PZ:gmtimate()没有2020.02.29日期

Guru**** 2387830 points
Other Parts Discussed in Thread: MSP-EXP432E401Y, EK-TM4C1294XL, EK-TM4C123GXL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/868078/compiler-tm4c1231h6pz-gmtime-not-have-2020-02-29-date

器件型号:TM4C1231H6PZ
主题中讨论的其他器件:MSP-EXP432E401YEK-TM4C1294XLEK-TM4C123GXL

工具/软件:TI C/C++编译器

我的编译器版本:TI v16.9.4.LTS

rawtime = UnixTimestamp;
PTM =*gmtime (&rawtime); 

当 UnixTimestamp = 1582912799时、日期为2020.02.28 23:59:59

 当 UnixTimestamp = 1582912800时、日期为2020.03.01 00:00:00

是否有新的编译器版本可以解决此问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不幸的是,我无法再现这种行为。  这是我所做的。

    我为 TI Launchpad MSP-EXP432E401Y 创建了一个新的 CCS 项目。  它有一个源文件...

    #include /* PUT、printf */
    #include /* time_t、struct tm、time、gmtime */
    
    #define offset_hours 6L
    #define base_time 1582912799L +(offset_hours * 60L * 60L)
    
    int main ()
    {
    time_t rawtime;
    struct tm * pTM;
    
    puts ("第一个测试");
    rawtime = base_time;
    Pawtm = gmtime;(&rgmtime)
    
    printf ("%2D-%2D-%4D %2D:%02d\n"、
    PTM->TM_mon+1、
    PTM->TM_mday、
    PTM->TM_year + 1900、
    PTM->TM_Hour、
    PTM->TM_min);
    
    P负载("第二次测试");
    rawtime = base_time+1;
    PTM = gmttime (&rawtime);
    
    printf ("%2D-%2D-%4D %2D:%02d\n"、
    PTM->TM_mon+1、
    PTM->TM_mday、
    PTM->TM_year + 1900、
    PTM->TM_Hour、
    PTM->TM_min);
    
    返回0;
    }
    

    我从 CCS 项目默认选项开始。  我将堆栈和堆每个增加到0x1000字。  我添加了-D_TI_TIME_USS_64、因此 epoch 将为1970年1月1日(我认为您也是如此)。  当我运行它时,我得到这个输出...

    首次测试
    2-28-2020 23:59
    第二次测试
    2-29-2020 0:00 

    请向我发送类似的内容、以说明问题。

    侧注... 以下是有关 offset_hours hack 的说明。  我只是进行了实验、直到我在2月28日的最后一秒和2月29日的1秒内到达 time_t 值。  我认为这对我来说是不同的、因为我没有更改 RTS 源文件 tmzone.c 中的任何这些值

    _data_access TZ _tz =
    {
    -1、 /*日光*/
    21600、 /*时区*/"CST"
    、 /* tzname */
    "dst"、 /* dstname */
    };
    

    但我没有确认这一点。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的乔治:
    感谢你的答复。
    您的环境是 MSP430吗? 编译器版本不同?
    下面是我的调试屏幕截图。

    2020.03.01.JPG

    2020.02.28.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    乔治

    我能够重现此问题、但仅在 未定义_TI_TIME_USS_64时。 随附的是在 EK-TM4C123GXL Launchpad 上运行的测试用例。 请告诉我您是否需要(或者我可以将其移植到 EK-TM4C1294XL Launchpad)。

    /cfs-file/__key/communityserver-discussions-components-files/908/Feb29_5F00_2020.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我明白发生了什么。  TI 编译器和 RTS 时间函数的运行方式如文档所述。  您做出了一些错误的假设。

    在您了解文章 时间和时钟 RTS 函数后、我的答案才有意义。  请关注有关 epoch 的部分。

    避免使用1582912799等原始 TIME_t 值  。  如果您被迫使用它们、那么您必须知道这些原始值中隐含的 epoch、并且该 epoch 必须与时间相关 RTS 函数中使用的 epoch 相匹配。  在您的情况下、epoch 不匹配。  您假设时代是1970年1月1日。  但 RTS 时间函数中假定的 epoch 为1900年1月1日。  通过预先定义预处理器符号 __TI_TIME_USS_64,可以将 RTS 时间函数的 epoch 更改为1970年1月1日。  通常的方法是添加构建选项-D_TI_TIME_USS_64。   

    当 epoch 为1900年1月1日时、原始时间值 1582912799的年份为1950年、这不是闰年。  这就是为什么没有2月29日。

    注意结构字段 TM_year 的定义是1900年以来的年数。  无论时代如何,情况都是如此。  您似乎假设  TM_year 是1970年以来的年数。

    [引用用户="Andy Deng ]您的环境是 MSP430吗?

    否  它是 MSP432。  系统的 CPU 内核是 ARM Cortex-M4F。

    [引用 user="Andy Deng "]编译器版本不是相同的吗?

    我使用了 TI ARM 编译器和 RTS 版本号16.9.4.LTS。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您解决了我的问题。