C++ 获取特定时区的当前GMT偏移量
给定本地时区以外的特定时区,例如美国/洛杉矶,如何找到该时区的当前GMT偏移量?目的是就DST变更开展这项工作。也就是说,洛杉矶的GMT偏移量为-8,在夏令时调整为-7 有人建议操纵TZ环境变量,这会影响localtime返回之类的函数,但我希望有一个解决方案,它不会影响例如不可重入的环境变量C++ 获取特定时区的当前GMT偏移量,c++,timezone,C++,Timezone,给定本地时区以外的特定时区,例如美国/洛杉矶,如何找到该时区的当前GMT偏移量?目的是就DST变更开展这项工作。也就是说,洛杉矶的GMT偏移量为-8,在夏令时调整为-7 有人建议操纵TZ环境变量,这会影响localtime返回之类的函数,但我希望有一个解决方案,它不会影响例如不可重入的环境变量 也似乎所有的信息都是通过ZDUP在/Ur/Stuts/ZONEngEnter上获得的,但是从C++中我不清楚如何得到这个。 < P>我已经找到了使用Boost的解决方案,但是它似乎有点迂回。它使用以下步骤
也似乎所有的信息都是通过ZDUP在/Ur/Stuts/ZONEngEnter上获得的,但是从C++中我不清楚如何得到这个。
< P>我已经找到了使用Boost的解决方案,但是它似乎有点迂回。它使用以下步骤: 加载一个可转换时区名称的,该时区名称包含有关DST开始和结束时间的信息。这是一个几百行长的CSV,很容易获得。 通过查找所述数据库,使用GMT和特定时区获取当前时间 取两次之间的差值,得到GMT偏移量 用一个示例程序可能更清楚:#include <iostream>
#include <boost/date_time/local_time/local_time.hpp>
int main(int argc, char* argv[]) {
if (argc != 2) {
std::cerr << "Usage: program tz_name\n";
return 1;
}
// Load time zone database
boost::local_time::tz_database tz_db;
tz_db.load_from_file("date_time_zonespec.csv");
// Current time
auto t = boost::posix_time::second_clock::local_time();
// Get the time for GMT; we'll use this to compare against other time zones
boost::local_time::time_zone_ptr gmt_tzp{new boost::local_time::posix_time_zone("GMT")};
boost::local_time::local_date_time gmt{t, gmt_tzp};
// Get time for specific time zone
boost::local_time::local_date_time local{t, tz_db.time_zone_from_region(argv[1])};
// Calculate difference between local time and GMT time
auto difference = local.local_time() - gmt.local_time();
// Print some information
auto offset_minutes = difference.total_seconds() / 60;
std::cout << "Zone " << local.zone()->std_zone_name() << " GMT offset minutes " << offset_minutes << "\n";
return 0;
}
我已经找到了一个使用Boost的解决方案,但它似乎有点迂回。它使用以下步骤: 加载一个可转换时区名称的,该时区名称包含有关DST开始和结束时间的信息。这是一个几百行长的CSV,很容易获得。 通过查找所述数据库,使用GMT和特定时区获取当前时间 取两次之间的差值,得到GMT偏移量 用一个示例程序可能更清楚:
#include <iostream>
#include <boost/date_time/local_time/local_time.hpp>
int main(int argc, char* argv[]) {
if (argc != 2) {
std::cerr << "Usage: program tz_name\n";
return 1;
}
// Load time zone database
boost::local_time::tz_database tz_db;
tz_db.load_from_file("date_time_zonespec.csv");
// Current time
auto t = boost::posix_time::second_clock::local_time();
// Get the time for GMT; we'll use this to compare against other time zones
boost::local_time::time_zone_ptr gmt_tzp{new boost::local_time::posix_time_zone("GMT")};
boost::local_time::local_date_time gmt{t, gmt_tzp};
// Get time for specific time zone
boost::local_time::local_date_time local{t, tz_db.time_zone_from_region(argv[1])};
// Calculate difference between local time and GMT time
auto difference = local.local_time() - gmt.local_time();
// Print some information
auto offset_minutes = difference.total_seconds() / 60;
std::cout << "Zone " << local.zone()->std_zone_name() << " GMT offset minutes " << offset_minutes << "\n";
return 0;
}
你可以考虑使用一种方法。它包含在时区之间转换的函数。看 例如,可以创建时区对象:
TimeZone *tz = TimeZone::createTimeZone("America/Los_Angeles");
然后可以使用getOffset之类的方法
参见,和.
一种方法,你可以考虑使用。它包含在时区之间转换的函数。看
例如,可以创建时区对象:TimeZone *tz = TimeZone::createTimeZone("America/Los_Angeles");
然后可以使用getOffset之类的方法
有关旧问题,请参见、和。新信息: 有一个新的开放源码,它将完全解析您的本地副本,包括所有历史数据,甚至闰秒。需要C++11或C++14编译器。您可以随时使用它来查找有关任何时区的详细信息。有关此库的详细信息包含在上面的链接中 一个例子是:
#include "tz.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
auto zone = locate_zone("America/Los_Angeles");
auto tp = system_clock::now();
auto info = zone->get_info(tp);
std::cout << "Information for " << zone->name() << " at " << tp << " UTC is:\n"
<< info << '\n';
tp = sys_days{nov/7/2014} + 53min;
info = zone->get_info(tp);
std::cout << "Information for " << zone->name() << " at " << tp << " UTC is:\n"
<< info << '\n';
}
该输出解释如下:
在我回答这个问题的那天,美国/洛杉矶的UTC偏移量是-7小时,时区的缩写是PDT。这与该地区的标准时间相差1小时。此偏移和缩写至少在UTC时间点范围内有效:[2015-03-08 10:00:00,2015-11-01 09:00:00
提出此问题的当天,美国/洛杉矶的UTC偏移量为-8小时,时区的缩写为PST。这与该地区的标准时间没有偏移。此偏移量和缩写至少在UTC时间点的范围内有效:[2014-11-02 09:00:00,2015-03-08 10:00:00
这是一个问题,我们欢迎请求将其移植到尽可能多的C++11/14平台上。关于旧问题的新信息: 有一个新的开放源代码,它将完全解析的本地副本,包括所有历史数据,甚至闰秒。需要一个C++11或C++14编译器。您可以随时使用它查找有关任何时区的详细信息。有关此库的详细信息包含在上面的链接中 一个例子是:
#include "tz.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
auto zone = locate_zone("America/Los_Angeles");
auto tp = system_clock::now();
auto info = zone->get_info(tp);
std::cout << "Information for " << zone->name() << " at " << tp << " UTC is:\n"
<< info << '\n';
tp = sys_days{nov/7/2014} + 53min;
info = zone->get_info(tp);
std::cout << "Information for " << zone->name() << " at " << tp << " UTC is:\n"
<< info << '\n';
}
该输出解释如下:
在我回答这个问题的那天,美国/洛杉矶的UTC偏移量为-7小时,时区的缩写为PDT。这是该地区标准时间的偏移量1小时。该偏移量和缩写至少在UTC时间点的范围内有效:[2015-03-08 10:00:00,2015-11-01 09:00:00
提出此问题的当天,美国/洛杉矶的UTC偏移量为-8小时,时区的缩写为PST。这与该地区的标准时间没有偏移。此偏移量和缩写至少在UTC时间点的范围内有效:[2014-11-02 09:00:00,2015-03-08 10:00:00
这是一个很好的例子,我们欢迎请求将其移植到尽可能多的C++11/14平台。这里的问题是,它已经严重过时。当它准确时,它只对当前的分区规则准确。它是扁平的,就像POSIX分区一样。包括时区规则随时间变化的丰富历史。这里的问题是hat已经严重过时。当它准确时,它只对当前的区域规则准确。它是扁平的,就像POSIX区域一样。包括
时区规则随时间变化的丰富历史。