如何在C ++中区分GMT时间和任何时区

时间:2012-07-17 11:36:58

标签: c++

我想要一个C ++解决方案来获得GMT时间和任何时区之间的小时差异。 例如 这是我想在C ++中创建的Java

// New York
Calendar c = new GregorianCalendar(TimeZone.getTimeZone("America/New_York"));  

// Alaska  
c = new GregorianCalendar(TimeZone.getTimeZone("America/Anchorage"));
// Difference between New York and Alaska  

请告诉我如何在C ++中获得这个时区

2 个答案:

答案 0 :(得分:1)

您可以使用cctz库计算某个特定时间两个不同时区之间UTC偏移的差异。

#include <chrono>
#include "cctz.h"
using namespace std::chrono;

cctz::TimeZone nyc;
cctz::LoadTimeZone("America/New_York", &nyc);

cctz::TimeZone anc;
cctz::LoadTimeZone("America/Anchorage", &anc);

const auto now = system_clock::now();
const auto nyc_off = cctz::BreakTime(now, nyc).offset;
const auto anc_off = cctz::BreakTime(now, anc).offset;

const auto off_diff = nyc_off - anc_off;

现在,事实是你真的不想这样做。真。健康,现代的代码永远不应该(我说永远不会,因为我的意思是从不)关心UTC补偿。使用UTC偏移进行计算您的时区库的工作,如果您的时区库没有为您处理,那么您使用的是错误的时区库。如果您认为您关心UTC偏移,那么我建议您查看以下内容:

  • 在其github页面上阅读CCTZ的基本概念部分
  • 观看CppCon 2015的Time Programming Fundamentals
  • 阅读cctz.h头文件(简短而简单)

[免责声明:我是cctz的作者。]

答案 1 :(得分:1)

我已经盯着Greg's good answer几天了,我正在考虑为my timezone library添加一些语法糖:

namespace date
{

class zoneverter
{
    const Zone* zp1_;
    const Zone* zp2_;

public:
    zoneverter(const Zone* z1, const Zone* z2)
        : zp1_(z1)
        , zp2_(z2)
        {}

    zoneverter(const Zone* z1, const std::string& z2)
        : zoneverter(z1, locate_zone(z2))
        {}

    zoneverter(const std::string& z1, const Zone* z2)
        : zoneverter(locate_zone(z1), z2)
        {}

    zoneverter(const std::string& z1, const std::string& z2)
        : zoneverter(locate_zone(z1), locate_zone(z2))
        {}

    template <class Rep, class Period>
    auto
    operator<<(std::chrono::time_point<std::chrono::system_clock,
                                       std::chrono::duration<Rep, Period>> tp) const
    {
        return zp1_->to_local(zp2_->to_sys(tp)).first;
    }
};

}  // namespace date

这增加了一个像流媒体一样的对象&#34;允许人们通过它传输std::chrono::time_point以将其从一个时区转换为另一个时区。这是一个非常简单的设备,它除了添加一些语法糖之外什么都没做,代价是从my timezone library删除一些信息。

它会像这样使用:

int
main()
{
    // So things don't get overly verbose
    using namespace date;
    using namespace std::chrono;

    // Set up the zone converters:
    zoneverter nyc_from_utc{"America/New_York",  "UTC"};
    zoneverter anc_from_nyc{"America/Anchorage", "America/New_York"};

    // Get the current time in New York and convert that to the current time in Anchorage
    auto now_nyc = nyc_from_utc << system_clock::now();
    auto now_anc = anc_from_nyc << now_nyc;

    // Output the difference
    std::cout << make_time(now_nyc - now_anc) << '\n';
}

目前为我输出:

04:00:00.000000

我也不确定这种语法糖是否比目前的语法足够好以保证其存在:

int
main()
{
    // So things don't get overly verbose
    using namespace date;
    using namespace std::chrono;

    // Set up the zones:
    auto nyc_zone = locate_zone("America/New_York");
    auto anc_zone = locate_zone("America/Anchorage");

    // Get the current time in New York and the current time in Anchorage
    auto now_utc = system_clock::now();
    auto now_nyc = nyc_zone->to_local(now_utc).first;
    auto now_anc = anc_zone->to_local(now_utc).first;

    // Output the difference
    std::cout << make_time(now_nyc - now_anc) << '\n';
}