如何在 CMake 中将 UNIX 时间戳转换为 ISO

How do I convert a UNIX timestamp to ISO in CMake

我有一个类似于 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

如果你想让这个函数使用一个特定的时间而不是当前时间,你可以set环境变量SOURCE_DATE_EPOCH到UNIX -样式时间戳(整数):

# 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值,这样当修改它时可以设置回它以前的值完全的。