C ++:你会选择boost :: date_time或icu :: date / time库吗?

时间:2012-02-20 00:31:22

标签: c++ boost icu boost-date-time

我的应用程序需要自定义时间和日期设置功能。我检查了ICU和boost :: date_time库。从完整性的角度来看,两者似乎都符合我的要求。我想知道两者之间是否有任何偏好以及基于什么?哪一个会在表现上得分?

1 个答案:

答案 0 :(得分:12)

如果没有关于您的特定用例和环境的更多信息,就无法给出关于两个库是否优于另一个库的明确答案。正如Xeo所说,分析是解决性能问题的最佳方法。

如果您的用例包含“常规”日期/时间操作(,您还不知道所需的全部日期/时间操作),那么有几个选择你必须做。正如Boost.DateTime documentation所解释的那样,您可以在这三种功能之间进行选择:

  1. 与挂钟时间完全一致
  2. 时刻之间的准确计算
  3. 将来处理时间的能力
  4. 没有图书馆可以同时隐含地处理所有三个图书馆的一个原因是,确定在给定时间点是否存在夏令时时间取决于管辖权,其政治问题以及许多其他因素。因此,涉及未来日期的计算可能会变得不准确。

    在决定这些功能时,您会注意到地理位置和本地化起着重要作用。例如,如果您的日期/时间要求仅需要支持单个区域设置,那么将大型ICU库作为依赖项引入是没有正当理由的。但是,你可能不应该使用Boost.DateTime:作为一个与语言环境无关的库,它忽略了一周的第一天因语言环境而异的事实。此外,Boost.DateTime的时区支持为broken;大多数现代软件使用Olson database进行时区处理和转换。相反,在使用Boost处理日期,时间和日历时,您应该考虑Boost.Locale

    默认情况下,Boost.Locale uses ICU for all localization tasks,但提供使用非基于ICU的本地化后端的选项。因此,如果您未在其他地方使用Boost(无论出于何种原因)并且需要支持超出当前OS时区的时区以及从UTC转移的时区(忽略夏令时),则仅使用ICU。如果您在其他地方使用Boost,您可以选择Boost.Locale和ICU,但差异很小(最后,ICU包含在内,因此它确实是一个风格和一致性问题)。如果你没有在其他地方使用Boost并且你只处理操作系统时区的日期(或使用先验已知的UTC偏移量进行日期修改),则会出现最终选择。在这种情况下,您可能应该使用Boost.Locale.DateTime,但没有ICU支持。

    摘要

    • 不要使用Boost.DateTime有两个原因:(1)时区支持被破坏; (2)它忽略了“星期几”计算取决于场所的事实。改为使用Boost.Locale.DateTime。
    • 如果您在其他地方使用Boost,请继续使用它。它将自动包含基于ICU的本地化后端。您也可以直接调用它们(直接包括ICU),但没有重大区别。
    • 如果您在其他地方使用Boost ,那么您的选择取决于用例是否与区域设置无关。如果它与语言环境无关,则可以使用Boost.Locale.DateTime的非基于ICU的本地化后端(例如,std,posix)并避免ICU开销。或者,如果您的用例取决于区域设置,那么您可以使用ICU而不会引入Boost的开销。
    • 关于绩效:分析是了解的唯一方法。