boost-date-time - boost::posix_time 在发布版本中失败

标签 boost-date-time

我想在每次程序运行时打开一个新的日志文件,所以我用当前时间创建了一个文件名。

FILE * fplog;

void OpenLog()
{
    boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
    char buf[256];
    sprintf(buf,"ecrew%d%02d%02d_%02d%02d%02d.log",
        now.date().year(),now.date().month(),now.date().day(),
        now.time_of_day().hours(),now.time_of_day().minutes(),now.time_of_day().seconds()); 
    fplog = fopen(buf,"w");

}

这在调试版本中工作得很好,生成的文件的名称如

ecrew20110309_141506.log

然而,相同的代码在发布版本中奇怪地失败了

ecrew198619589827196617_141338.log

顺便说一句,这也以同样的方式失败了:

boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
char buf[256];

boost::gregorian::date day (boost::gregorian::day_clock::local_day());

sprintf(buf,"ecrew%d%02d%02d_%02d%02d%02d.log",
    day.year(),day.month(),day.day(),
now.time_of_day().hours(),now.time_of_day().minutes(),now.time_of_day().seconds()); 

fplog = fopen(buf,"w");

这个有效:

boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
char buf[256];
sprintf(buf,"ecrew%s_%02d%02d%02d.log",
    to_iso_string( boost::gregorian::day_clock::local_day() ).c_str(),
    now.time_of_day().hours(),now.time_of_day().minutes(),now.time_of_day().seconds()); 
fplog = fopen(buf,"w");

我仍然很好奇为什么前两个版本在发布构建中失败,但在调试中工作。

最佳答案

好吧,我来晚了一点,但当我自己寻找答案时偶然发现了你的问题(day_clock::local_day() 在编译为 Release 时给出了奇怪的结果,在 Win XP + Boost 1.46 上), 我想我应该带着对我有用的东西回来。

数据似乎以 16 位方式存储(我只使用年、月和日),但是当您读取它们时,您会得到一个 32 位整数,无论​​存在什么错误,它都会将垃圾写入最高位或者它在写入低字节之前不会清除它们。

所以我的解决方法是将最上面的 16 位清零:

date todaysdate(day_clock::local_day());
int year = todaysdate.year() & 0xFFFF;

而不是说:

date todaysdate(day_clock::local_day());
int year = todaysdate.year();

无论如何,它对我来说效果很好。

瓦尔蒙德

关于boost-date-time - boost::posix_time 在发布版本中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5251038/

相关文章:

c++ - boost ptime : how to format data in a way browsers send inside headers of http requests?

c++ - Boost 库缺少 'libboost_date_time-vc90-mt-gd-1_44.lib 文件。如何使用 bjam 只构建这个 lib 文件?

c++ - 如何根据 RFC 3339 格式化 boost::date_time-object

c++ - unix 时间戳到 boost::posix_time::ptime

c++ - 如何使用 boost::date_time 从 time_t 获取本地日期时间?

c - 来自 C 的 Boost.DateTime?

c++ - Boost C++ 1.60 中的 `gregorian has not been declared` 错误

c++ - 提取日期字符串并确定哪个更早

c++ - 引用 `boost::date_time` 枚举项的正确方法

c++ - 从 boost 日期对象获取月份