如何获得ICU中的所有时区名称

时间:2014-07-31 09:45:35

标签: c++ datetime boost icu

我正在使用带有ICU后端的boost :: locale来在不同的时区之间进行时间转换。当创建boost :: local :: Calendar时,我可以传入一个像“America / New_York”这样的字符串来指定时区信息。

但是如何获得所有有效时区名称的列表?

来自ICU doc,它提到用户可以使用TimeZone.getAvailableIDs()方法迭代所有时区名称。但我甚至无法在timezone.h中找到一个名为getAvailableIDs的方法。

2 个答案:

答案 0 :(得分:4)

您可以使用TimeZone.createEnumeration()获取所有时区名称的列表。它在文档中说使用getAvailabeIDs,但这种方法似乎不再存在。

答案 1 :(得分:1)

我设法使用ICU 4.4.2实现它:

#include <iostream>
#include <unicode/timezone.h>
#include <unicode/unistr.h>

using namespace icu;

int main()
{
   StringEnumeration *timeZoneIds = TimeZone::createEnumeration();

   UErrorCode status = U_ZERO_ERROR;
   const UnicodeString *zoneId = timeZoneIds->snext(status);

   while (zoneId != NULL && status == U_ZERO_ERROR)
   {
      std::string zoneIdString;
      zoneId->toUTF8String(zoneIdString);

      std::cout << zoneIdString << std::endl;

      zoneId = timeZoneIds->snext(status);
   }

   delete timeZoneIds;

   return 0;
}