Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取特定时区的当前GMT偏移量_C++_Timezone - Fatal编程技术网

C++ 获取特定时区的当前GMT偏移量

C++ 获取特定时区的当前GMT偏移量,c++,timezone,C++,Timezone,给定本地时区以外的特定时区,例如美国/洛杉矶,如何找到该时区的当前GMT偏移量?目的是就DST变更开展这项工作。也就是说,洛杉矶的GMT偏移量为-8,在夏令时调整为-7 有人建议操纵TZ环境变量,这会影响localtime返回之类的函数,但我希望有一个解决方案,它不会影响例如不可重入的环境变量 也似乎所有的信息都是通过ZDUP在/Ur/Stuts/ZONEngEnter上获得的,但是从C++中我不清楚如何得到这个。 < P>我已经找到了使用Boost的解决方案,但是它似乎有点迂回。它使用以下步骤

给定本地时区以外的特定时区,例如美国/洛杉矶,如何找到该时区的当前GMT偏移量?目的是就DST变更开展这项工作。也就是说,洛杉矶的GMT偏移量为-8,在夏令时调整为-7

有人建议操纵TZ环境变量,这会影响localtime返回之类的函数,但我希望有一个解决方案,它不会影响例如不可重入的环境变量


也似乎所有的信息都是通过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区域一样。包括 时区规则随时间变化的丰富历史。