我试图从文本文件中解析日期时间。时间戳具有微秒精度,但由于我无法控制的历史原因,它们是使用冒号而不是点来创建的,以分隔小数秒部分,例如:
shuffle
而不是
2015/05/05 03:10:43:537408
我能够使用此代码解析这些时间戳而不保留小数秒:
2015/05/05 03:10:43.537408
正如您可能猜到的那样,使用小写-f小数秒格式化程序会导致解析失败(pt仍然不是一个日期时间)。此外,在格式字符串中插入冒号也没有帮助:
#include <iostream>
#include <sstream>
#include <boost/date_time.hpp>
namespace bt = boost::posix_time;
const std::string inputString = "2015/05/05 03:10:43:537408";
const std::string inputFormat = "%Y/%m/%d %H:%M:%S%F";
bt::time_input_facet * facet = new bt::time_input_facet(inputFormat);
const std::locale loc(std::locale::classic(), facet);
std::istringstream iss(inputString);
iss.imbue(loc);
boost::posix_time::ptime pt;
iss >> pt;
Boost似乎推断出点分隔符。
除了明确检查冒号分隔符并以不同方式处理它之外,是否有人知道是否可以使用boost库解析这种非标准时间格式?
答案 0 :(得分:1)
没有内置的方式。
time_facet get函数将'.'
设为seperator:
case 'f':
{
// check for decimal, check SV if missing
if(*sitr == '.') {
++sitr;
parse_frac_type(sitr, stream_end, frac);
// sitr will point to next expected char after this parsing
// is complete so no need to advance it
use_current_char = true;
}
else {
return check_special_value(sitr, stream_end, t, c);
}
break;
}
case 'F':
{
// check for decimal, skip if missing
if(*sitr == '.') {
++sitr;
parse_frac_type(sitr, stream_end, frac);
// sitr will point to next expected char after this parsing
// is complete so no need to advance it
use_current_char = true;
}
else {
// nothing was parsed so we don't want to advance sitr
use_current_char = true;
}
break;
}
您可以修改实现(请参阅例如Format a posix time with just 3 digits in fractional seconds)或子类并覆盖相关的成员函数。
不管因为这个课程没有为继承而设计,它会有点烦人。
我个人认为格式字符串表示只小数设置没有任何分隔符,因此您确实可以在格式中包含:
说明书
答案 1 :(得分:0)
如果您从“ boost / data_time / time_facet.hpp”标题中重新实现“ time_input_facet”类并注释以下几行,则可以解决问题:
public class ScreenCropperDrawer
{
private static Graphics screenGraphics;
public static void FillRectangle(Brush brush, Rectangle rect)
{
if (screenGraphics == null)
{
screenGraphics = Graphics.FromHwnd(IntPtr.Zero);
}
screenGraphics.FillRectangle(brush, rect);
}
}