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.

[参考译文] CC3220SF:seconds_get () 比 UTC 时间提前 6 小时返回 epcoh 时间。

Guru**** 2468560 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1533481/cc3220sf-seconds_get-returns-epcoh-time-6hrs-ahead-of-utc-time

器件型号:CC3220SF


工具/软件:

您好、  

环境:SDK 版本 7

我正在将系统范围的时间设置为 UTC、下面的代码设置 NWP 和应用的 UTC 时间、但当应用的另一部分尝试读取当前时间时、它会返回 epoch time + 6 小时偏移。  

问:我是否可以将时区设置为 UTC?  

为什么 seconds_get () 返回具有 6 小时偏移的 epoch 时间?

SET_NWP TIME (time_t ts)

SlDateTime_t dt;
STRUCT TM;
INT 结果;

debug_console_Log (wifi、info、“NTP epoch time:%u“、ts);

Seconds_set (0);

debug_console_Log (wifi、info、“重置到 epoch 时间:%u“、seconds_get ());
/*将大纪元后的时间转换为 GM 时间*/
tm =*gmtime (ts);

/*在网络处理器上设置系统时钟以验证证书*/
DT.TM_DAY = TM.TM_mday;
/* TM.TM_mon 是自一月起的月份、因此添加 1 以获得实际月份*/
dt.TM_mon = TM.TM_mon + 1;
/* TM.TM_YEAR 是自 1900 年起的年份,所以加上 1900 得到实际年份*/
DT.TM_YEAR = TM.TM_YEAR + 1900;
DT.TM_HOUR = TM.TM_HOUR;
DT.TM_MIN = TM.TM_MIN;
DT.TM_sec = TM.TM_sec;

//设置 NWP 时间
结果= sl_DeviceSet (SL_DEVICE_General、SL_DEVICE_GENERAL_DATE_TIME、
sizeof (SlDateTime_t)、(unsigned char *)(&dt));

//设置应用时间

Seconds_set(UTC +(6*3600));//将 epoch 增加 6 小时以设置 ts 系统时间。

debug_console_Log (wifi、info、“在 epoch 时间之后:%u“、seconds_get ());

}

运行上述代码后:

NWP — 设置为 UTC 时间、但 Seconds_get = 1751057495

当前 UTC 时间:14:51、但时间:20:51

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

    您好 Prasun、感谢您的提问。 有什么理由吗

    Seconds_set (ts +(6 * 3600);

    就在执行 seconds_get() 之前? seconds_set 会增加 6 小时偏移量、这可能是您遇到的问题。

    如果您只执行 seconds_set (ts)、而没有 6 小时偏移、会发生什么情况?

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

    对不起,我不小心点击了解决方案. seconds_get 函数正常工作、  

    应用程序为 APP 和 NWP 设置 UTC — 它是有效的。

    该应用从云端接收 UTC epoch 时间、将其转换为 struct TM、校正时间、并使用 mktime 检索调整后的 epoch 时间。 调整后的时间不正确;距 UTC 6 小时、这似乎是尝试返回位置时间。  

    有两个函数、即 ctime 和 mktime。 我的理解是、ctime 返回 localtime、mktime 返回 UTC、但这不是。

    问题:TI 库中是否有函数可以帮助我从结构中检索 UTC 时间? 或者我设置的设置(如系统时区)在使用 mktime 或 ctime 时返回 UTC?

    希望现在我所面临的问题已经很清楚了。

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

    您好 Prasun、感谢您的答复。

    我想首先询问 你传递到 ctime 的参数是什么,因为这将极大地影响你的输出(它根据你传递的返回本地时间)。 请分享您正在传递的内容以及预期和实际输出。

    您能在 mktime 也分享相同内容吗? 我看不出您在使用它、但您对这两个功能的描述是正确的。  

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

    time_t current_time = seconds_get ();

    struct TM current_tm_struct =*gmtime (&current_time);

    struct TM next_run_TM_struct = current_tm_struct;


    debug_console_Log (ALERT、INFO、“DD 当前时间是:%s“、ctime (&current_time));

    next_run_TM_struct.TM_hour = settings_ptr->hour;
    next_run_TM_struct.TM_MIN = settings_ptr->min;
    next_run_TM_struct.TM_sec = 0;

    time_t next_run_time = mktime (&next_run_TM_struct);

    问题是 next_run_time 返回值: 14:51、但正确的 UTC 时间是:20:51  

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

    time_t current_time = seconds_get ();

    struct TM current_tm_struct =*gmtime (&current_time);

    struct TM next_run_TM_struct = current_tm_struct;


    debug_console_Log (ALERT、INFO、“DD 当前时间是:%s“、ctime (&current_time));

    next_run_TM_struct.TM_hour = settings_ptr->hour;
    next_run_TM_struct.TM_MIN = settings_ptr->min;
    next_run_TM_struct.TM_sec = 0;

    time_t next_run_time = mktime (&next_run_TM_struct);

    问题是 next_run_time 返回值: 14:51、但正确的 UTC 时间是:20:51  

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

    ctime 返回(或打印)什么?

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

    这是来自电流的、但会进行修改  

    Seconds_get - 1752769095

    CTime : Thu Jul 1710:18:15 2025

    NWP 时间:2025年7月17日 16:18:15

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

    这是来自电流的、但会进行修改  

    Seconds_get - 1752769095

    CTime : Thu Jul 1710:18:15 2025

    NWP 时间:2025年7月17日 16:18:15

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

    您是否还能包括预期的输出?

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

    ctime 不正确,因为我在东部时区,它得到了一些当地时间,这意味着有设置导致这种情况。 预计时间是返回 UTC 时间。  

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

    明白。 让我来调查一下、看看发生了什么;我将在 Next 星期一之前为您提供更新。  

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

    感谢您对此进行研究

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

    您好 Prasun。

    我做了一些初步挖掘,在 熟悉了 ctime 和 mktime 的函数定义和用例后,我在 onlinegdb.com/online_c_compiler 上进行了实验,并得到了以下输出:

    这些是我用来查看如何使用 gmtime、ctime 和 mktime 的链接:  

    https://www.tutorialspoint.com/c_standard_library/c_function_gmtime.htm

    https://www.tutorialspoint.com/c_standard_library/c_function_mktime.htm

    https://www.geeksforgeeks.org/c/ctime-function-in-c-c/

    我使用了从 seconds_get 获得的值、并将变量地址插入 gmtime 和 ctime 中。 然后在 mktime 中使用作为 gmtime 结果创建的结构的指针。 您从哪个库中导入 ctime 以获得不正确的时间?

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

    我发现问题;

    默认情况下、为 mktime 函数设置的时区为:  

    #define _TI_EPOCH_WDAY 1 /*星期一 Jan 11900 */^M
    #define _TI_EPOECT_YEAR 1900^M
    #define _TI_EPOCH_TZONE 21600 - 6 小时偏移  

    为了解决这个问题、我使用了:  

    //_tz 在 time.h 的某个位置定义
    tz.timezone = 0;
    tz.daylight = 0;

    这是成功的。