输入:包含日期和可选时间的字符串.不同的表现形式会很好但很必要.字符串是用户提供的,可能会格式错误.例子:
"2004-03-21 12:45:33" (我认为这是默认布局)"2004/03/21 12:45:33" (可选布局)"23.09.2004 04:12:21" (德语格式,可选)"2003-02-11" (时间可能会丢失)所需的输出:纪元以来(1970/01/01 00:00:00)或其他一些定点的秒数.
额外:此外,读取本地系统时间的UTC偏移量会很棒.
假设输入是相关机器上的本地时间.输出需要是UTC.系统只是Linux(需要Debian Lenny和Ubuntu).
我试图使用boost/date_time,但必须承认我无法绕过文档.以下工作无需从系统本地时间转换为UTC:
std::string date = "2000-01-01";
boost::posix_time::ptime ptimedate = boost::posix_time::time_from_string(date);
ptimedate += boost::posix_time::hours(Hardcoded_UTC_Offset);// where to get from?
struct tm = boost::posix_time::to_tm(ptimedate);
int64_t ticks = mktime(&mTmTime);
Run Code Online (Sandbox Code Playgroud)
我认为boost::date_time可以提供所需的UTC偏移,但我不知道如何.
是否有一些"标准"方式或我能做的最好的是直接通过减去来计算它gregorian::date(1970,1,1)?
在阅读问题之前:
这个问题不是关于它的使用有多大dynamic_cast.它只是它的表现.
我最近开发了一个dynamic_cast经常使用的设计.
在与同事讨论时,几乎每个人都说dynamic_cast不应该使用它,因为它的表现不好(这些是有不同背景的同事,在某些情况下彼此不认识.我在一家大公司工作)
我决定测试这种方法的性能而不是仅仅相信它们.
使用以下代码:
ptime firstValue( microsec_clock::local_time() );
ChildObject* castedObject = dynamic_cast<ChildObject*>(parentObject);
ptime secondValue( microsec_clock::local_time() );
time_duration diff = secondValue - firstValue;
std::cout << "Cast1 lasts:\t" << diff.fractional_seconds() << " microsec" << std::endl;
Run Code Online (Sandbox Code Playgroud)
上面的代码使用boost::date_timeLinux上的方法来获取可用的值.
我已经完成dynamic_cast了三合一执行,测量它们的代码是相同的.
执行结果如下:
Cast1持续时间:74
microsec Cast2持续时间:2
microsec Cast3持续时间:1微秒
第一次施法总是花费74-111微秒,同样执行的以下演员需要1-3微秒.
最后我的问题
是:dynamic_cast真的表现不好吗?
根据测试结果,它没有.我的测试代码是否正确?
为什么这么多开发人员认为如果不是这么慢呢?
在我看到的大多数例子中:
time_zone_ptr zone( new posix_time_zone("MST-07") );
Run Code Online (Sandbox Code Playgroud)
但我只想获得运行代码的机器的当前时区.我不想硬编码时区名称.
我试图以优雅的方式将当前时间作为"YYYY-MM-DD-HH-MM-SS"格式化字符串.我可以从Boost的"Date Time"库获取ISO格式的当前时间,但它有其他分隔字符串,这对我不起作用(我在文件名中使用它).当然我可以直接替换分隔字符串,但感觉有一种更好的方法可以使用日期时间的格式化选项.有这样的方式,如果有的话,我该如何使用它?
我编写了以下函数来使用boost.date_time获取日期/时间字符串.
namespace bpt = boost::posix_time;
string
get_date_time_string(bpt::ptime time)
{
bpt::time_facet * facet(new bpt::time_facet);
facet->format("%Y%m%d%H%M%S");
stringstream return_value;
return_value.imbue(std::locale(std::locale::classic(), facet));
return_value << time;
return return_value.str();
}
Run Code Online (Sandbox Code Playgroud)
我对所有权/一个简单的问题delete了的"ING facet对象.std :: locale的构造函数没有明确的所有权/ delete' facet.尝试使用shared_ptr-wrapped和堆栈分配版本facet- 两者都导致了seg-fault.此外,通过valgrind运行上述函数并没有显示任何泄漏(这可能意味着语言环境或流正在delete处理),但我只是想清楚我在这里做正确的事情.谢谢.
如果我date +%H-%M-%S在命令行(Debian/Lenny)上做的话,我会得到一个用户友好的(不是UTC,而不是DST-less,正常人在他们的手表上的时间)打印时间.
获得同样东西的最简单方法是boost::date_time什么?
如果我这样做:
std::ostringstream msg;
boost::local_time::local_date_time t =
boost::local_time::local_sec_clock::local_time(
boost::local_time::time_zone_ptr()
);
boost::local_time::local_time_facet* lf(
new boost::local_time::local_time_facet("%H-%M-%S")
);
msg.imbue(std::locale(msg.getloc(),lf));
msg << t;
Run Code Online (Sandbox Code Playgroud)
然后msg.str()比我想要的时间早一个小时.我不确定这是因为它显示UTC或本地时区没有DST校正时间(我在英国).
修改上述内容以获得DST更正的本地时区时间的最简单方法是什么?我知道它涉及boost::date_time:: c_local_adjustor但无法从示例中弄清楚.
我需要将自纪元以来的秒数转换为ptime.我很确定必须有一个简单的方法来做到这一点,但我找不到任何东西.谢谢.
编辑:原始时间戳是浮点.我不能改变它,我不想失去亚秒精度.
我的应用需要自定义时间和日期设置功能.我检查了ICU和boost :: date_time库.从完整性的角度来看,两者似乎都符合我的要求.我想知道两者之间是否有任何偏好以及基于什么?哪一个会在表现上得分?
有趣的事实是,我确信我们大多数人都能在时间领域发挥作用 - 有些日期/时间可能看似有效,但实际上并不存在,例如夏令时切换时间凌晨2:30.
在C++(标准或Windows)中是否有办法确定给定的时区规范中给定的日期/时间是否有效?
boost-date-time ×10
c++ ×10
boost ×9
timezone ×2
datetime ×1
debian ×1
dynamic-cast ×1
facet ×1
icu ×1
locale ×1
performance ×1
time ×1
utc ×1
windows ×1