我想要一个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 ++中获得这个时区
答案 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偏移,那么我建议您查看以下内容:
[免责声明:我是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';
}