C++ C++;:如何使用ICU根据给定的时区偏移获取当前时间?

C++ C++;:如何使用ICU根据给定的时区偏移获取当前时间?,c++,timezone,icu,C++,Timezone,Icu,我想通过给定的时区偏移量(也需要计算夏令时)来获取当前时间,我尝试了以下代码,但snext函数返回NULL,ICU库版本为6.1,CentOS 7.6 64位+gcc 6.4.1 timezoneOffset = 1; //(UTC + 1) UErrorCode success = U_ZERO_ERROR; U_ICU_NAMESPACE::UnicodeString dateReturned, curTZNameEn, curTZNameFr; int32_t stdOffset =

我想通过给定的时区偏移量(也需要计算夏令时)来获取当前时间,我尝试了以下代码,但snext函数返回NULL,ICU库版本为6.1,CentOS 7.6 64位+gcc 6.4.1

timezoneOffset = 1; //(UTC + 1)

UErrorCode success = U_ZERO_ERROR;
U_ICU_NAMESPACE::UnicodeString dateReturned, curTZNameEn, curTZNameFr;

int32_t stdOffset = 0;
int32_t dstOffset = 0;
//  
// Create a Calendar to get current date
U_ICU_NAMESPACE::Calendar* calendar = U_ICU_NAMESPACE::Calendar::createInstance(success);
if (!calendar)
{
    return;
}

success = U_ZERO_ERROR;

UErrorCode ec;
std::string errorName;

int32_t rawOffset = timezoneOffset * 3600 * 1000;
U_ICU_NAMESPACE::StringEnumeration* se = U_ICU_NAMESPACE::TimeZone::createEnumeration(rawOffset); // Obtain timezones by GMT timezone offset
if (se)
{
    auto next = se->snext(ec);
    if (next && ec == U_ZERO_ERROR)
    {
        U_ICU_NAMESPACE::TimeZone *tzWest = U_ICU_NAMESPACE::TimeZone::createTimeZone(*next);
        if (tzWest)
        {
            UDate curDate = calendar->getNow();
            tzWest->getOffset(curDate, false, stdOffset, dstOffset, success);
            if (U_SUCCESS(success))
            {
                timezoneOffset = (stdOffset / (1000 * 60 * 60) + dstOffset / (1000 * 60 * 60));
            }
        }
    }
    else
    {
        errorName = u_errorName(ec); // The error name is "bogus error"
    }

    delete se;
}

delete calendar;
发件人:

可能存在多个具有相同GMT偏移的时区,它们处理夏令时的方式不同。例如,亚利桑那州不遵守夏令时。如果您询问对应于GMT-7:00的时区ID,您将得到两个时区ID的枚举:“America/Denver”,对应于冬季的山区标准时间和夏季的山区昼间时间,以及“America/Phoenix”,对应于全年的山区标准时间,甚至在夏季

换句话说,如果输入的所有内容都是偏移量,则无法正确计算夏令时。许多不同的分区可能共享此偏移,有些分区可能在标准时间使用,有些分区可能在白天使用,有些分区可能全年使用

还要了解世界不同地区使用DST的方式不同。有些比美国早或晚启动,有些根本不使用。在南半球使用它的人通常在冬季,而北半球在夏季,反之亦然。一个时区只切换30分钟,而不是通常的60分钟。在全球范围内没有单一的DST实施

在代码中,您正在创建在标准时间(或全年)内使用给定偏移量的分区枚举,但只检查枚举的第一项。无法保证第一项是正确使用的


你能做的最好的事情就是得到你拥有的偏移量的当前时间,而你并不需要ICU来做这件事。

我不知道ICU的
ICU
库,但可能值得考虑使用时区库,它很快将成为
C++
标准的一部分:不用担心。让它开着。也许其他人会用代码示例提供更直接的答案。只是想让你知道这里的挑战不是技术性的,而是地缘政治性的。