如何以正确的格式获取 UTC 偏移量(时区)?

Posted

技术标签:

【中文标题】如何以正确的格式获取 UTC 偏移量(时区)?【英文标题】:How to get UTC offset (timezone) in correct format? 【发布时间】:2020-12-29 06:42:07 【问题描述】:

我有这样的代码,可以将 Epoch 时间戳转换为 GMT 时间戳:

#include <array>
#include <ctime>
#include <string>

std::string getDateTimeZ(size_t epoch)

  const time_t time = epoch;
  const auto timeInfo = *localtime(&time);
  std::array<char, 80> buffer;
  std::strftime(buffer.data(), buffer.size(), "%Y-%m-%dT%H:%M:%S%z", &timeInfo);
  return buffer.data();

这很好,除了我的时间戳是例如:

2020-09-10T20:53:10+0300

我希望它是:

2020-09-10T20:53:10+03:00

如何开箱即用地执行此操作,而不会对结果字符串进行丑陋且容易出错的 hack?除了%z,我看不到任何其他获得偏移量的选项。

其他一些库,如 Boost 也是可以接受的。

【问题讨论】:

【参考方案1】:

您可以使用此preview of the C++20 &lt;chrono&gt; facilities,它适用于 C+11:

#include "date/tz.h"
#include <chrono>
#include <cstddef>
#include <string>
#include <sstream>

std::string
getDateTimeZ(std::size_t epoch)

    using namespace date;
    using namespace std::chrono;
    zoned_seconds ztcurrent_zone(), sys_secondssecondsepoch;
    std::ostringstream os;
    os << format("%FT%T%Ez", zt);
    return os.str();

这个库的诀窍是使用%Ez 代替%z

这个库确实需要some installation。

【讨论】:

以上是关于如何以正确的格式获取 UTC 偏移量(时区)?的主要内容,如果未能解决你的问题,请参考以下文章

如何从时区名称中获取时区偏移量

如何使用 pytz 从时区字符串中获取 UTC 偏移量?

从 UTC 偏移量获取时区名称

如何在 Rails 中获取 UTC 偏移量?

使用 Joda-Time 获取给定日期和时区的 UTC 偏移量

Python - 给定时间戳UTC和UTC偏移量的时区名称