【问题标题】:How to get a local date-time from a time_t with boost::date_time?如何使用 boost::date_time 从 time_t 获取本地日期时间?
【发布时间】:2011-09-02 20:50:10
【问题描述】:

我正在使用 boost::date_time 并且我得到了一个 time_t,它是由一个库使用 C 标准库中的 time() 函数生成的。

我正在寻找一种从那个 time_t 获取本地时间的方法。我正在阅读文档,如果不提供时区就找不到任何方法,我不知道,因为它取决于机器的语言环境,我找不到任何方法从中获取.

我错过了什么?

【问题讨论】:

  • 我认为你不能更改库,所以你被 time() 卡住了?
  • 没错。如果可以的话,我会使用升压给定的本地时间,而不是 time_t。但不能:/

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


【解决方案1】:

boost::posix_time::from_time_t()

#include <ctime>
#include <ostream>
#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/local_time_adjustor.hpp>
#include <boost/date_time/c_local_time_adjustor.hpp>

boost::posix_time::ptime local_ptime_from_utc_time_t(std::time_t const t)
{
    using boost::date_time::c_local_adjustor;
    using boost::posix_time::from_time_t;
    using boost::posix_time::ptime;
    return c_local_adjustor<ptime>::utc_to_local(from_time_t(t));
}

int main()
{
    using boost::posix_time::to_simple_string;
    using boost::posix_time::from_time_t;

    std::time_t t;
    std::time(&t); // initalize t as appropriate
    std::cout
        << "utc:   "
        << to_simple_string(from_time_t(t))
        << "\nlocal: "
        << to_simple_string(local_ptime_from_utc_time_t(t))
        << std::endl;
}

【讨论】:

  • -1 :我说的是当地时间。我已经在使用它了,这是错误的,因为它没有考虑语言环境时间。例如,我在 GMT+2,所以当我做 time() 时,它给了我 GMT+0,我必须增加两个小时才能得到正确的时间。我什至不知道该应用的用户将在哪里,需要以当地时间。
  • @Klaim :编辑以演示一个完整的示例(我认为从 utc 转换为本地是显而易见的部分,您不知道如何从 std::time_t 获取 ptime)。
【解决方案2】:

对于这个任务,我会忽略boost::date_time,而只使用标准库中的localtime(或localtime_r,如果有的话)。

【讨论】:

  • 好的,所以我使用它并用它构建了一个 boost::posix_time::ptime 来操纵本地化的时间。谢谢它的工作原理!
  • 提升日期/时间对象不应该是线程安全的吗?在这种情况下,本地时间并不是真正的替代方案。
  • @Michael:是的,线程安全将是使用“localtime_r,如果可用”的原因之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 2013-07-12
相关资源
最近更新 更多