【问题标题】:How do I convert a UNIX timestamp to ISO in CMake如何在 CMake 中将 UNIX 时间戳转换为 ISO
【发布时间】:2020-04-20 19:42:44
【问题描述】:

我有一个类似于 1587405820 -0600 的 UNIX 样式时间戳,我想将其转换为 ISO 样式格式,例如 YYYY-MM-DDTHH:MM:SSZ

CMake 在https://cmake.org/cmake/help/v3.12/command/string.html#timestamp 有一个string(TIMESTAMP ...) 命令,但这只会让我获得格式化字符串中的当前 时间,这对我的应用程序不起作用。我需要能够将现有时间转换为 ISO 格式。

有没有办法做到这一点?


更新

根据@squareskittles 的回答,这就是我最终得到的这个测试是正确的:

# Check that we get the current timestamp
string(TIMESTAMP TIME_T UTC)
message(STATUS ">>> T1: ${TIME_T}")

# Get the ISO string from our specific timestamp
set(ENV{SOURCE_DATE_EPOCH} 1587405820)
string(TIMESTAMP TIME_T UTC)
unset(ENV{SOURCE_DATE_EPOCH})
message(STATUS ">>> T2: ${TIME_T}")

# Check that we get the current timestamp again correctly
string(TIMESTAMP TIME_T UTC)
message(STATUS ">>> T3: ${TIME_T}")

这给了我这个输出:

-- >>> T1: 2020-04-22T15:08:13Z
-- >>> T2: 2020-04-20T18:03:40Z
-- >>> T3: 2020-04-22T15:08:13Z

【问题讨论】:

    标签: cmake unix-timestamp


    【解决方案1】:

    如果你希望这个函数使用一个特定的时间而不是当前时间,你可以set环境变量SOURCE_DATE_EPOCH到UNIX风格的时间戳(整数): p>

    # Set the environment variable to a specific timestamp.
    set(ENV{SOURCE_DATE_EPOCH} 1587405820)
    # Convert to ISO format, and print it.
    string(TIMESTAMP MY_TIME)
    message(STATUS ${MY_TIME})
    

    打印(对于 UTC -0600):

    2020-04-20T12:03:40
    

    如果需要将此时间调整为UTC时间,可以添加UTC参数:

    set(ENV{SOURCE_DATE_EPOCH} 1587405820)
    string(TIMESTAMP MY_TIME UTC)
    message(STATUS ${MY_TIME})
    

    打印:

    2020-04-20T18:03:40Z
    

    注意:如果这个SOURCE_DATE_EPOCH变量在你的CMake代码的其他地方使用,最好在修改它之前保存SOURCE_DATE_EPOCH的值,这样完成后可以将它设置回原来的值。

    【讨论】:

    • 我相信我会建议在使用后将 SOURCE_DATE_EPOCH 重置为以前的值,以免干扰其余代码。
    • @KamilCuk 这是一个很好的观点,所以我添加了一个注释。像这样在 CMake 中设置环境变量的范围只会影响当前的 CMake 调用,因此效果将仅限于此。
    猜你喜欢
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2011-04-16
    • 1970-01-01
    • 2017-03-30
    • 2021-05-13
    相关资源
    最近更新 更多