C ++中的日期/时间解析(任何格式字符串到Epoch) [英] Date/Time parsing in C++ (Any format string to Epoch)
问题描述
我在写一个C ++应用程序,必须解析日期/时间字符串并给出时代的时间。
但是日期/时间字符串的格式可以是多个(实际上说25种格式)如
I am writing a C++ app that has to parse a date/time string and give out epoch time. But the format of the date/time string can be more than one (actually say 25 formats) like
"EEE, dd MMM yyyy HH:mm:ss '('ZZZ')'",
"EEE, dd MMM yyyy HH:mm:ss '\"'ZZZ'\"'",
"EEE, dd MMM yyyy hh:mm:ss z",
"EEE, dd MMM yyyy HH:mm Z",
"EEE, dd MMM yyyy HH:mm:ss",
"EEE, MMM dd, yyyy 'at' HH:mm:ss z",
"EEE M/dd/yyyy hh:mm:ss a",
"EEE MMM dd HH:mm:ss z yyyy",
"EEE MMM dd hh:mm:ss yyyy",
"EEEE, MMMM dd, yyyy hh:mm:ss a",
"EEEE, MMMM dd, yyyy HH:mm a",
"EEEE, MMMM dd, yyyy HH:mm",
"MMM dd, yyyy hh:mm:ss a",
"dd MMM yyyy hh:mm:ss z",
"dd-MMM-yyyy HH:mm:ss z",
"dd MMM yy HH:mm:ss",
"MM/dd/yyyy hh:mm a (EEEE)",
"MM/dd/yyyy hh:mm a (EEEE)",
"MM/dd/yyyy hh:mm:ss",
"MM/dd/yyyy hh:mm a Z",
"MM/dd/yyyy hh:mma Z",
"MM/dd/yyyy hh:mma",
"MM/dd/yyyy hh:mm a",
"MM/dd/yyyy hh:mm Z",
"MM/dd/yy hh:mm a Z",
"MM/dd/yy hh:mma Z",
"MM/dd/yy HH:mm a",
"MM/dd/yy HH:mm Z",
"MM/dd/yyyy",
"yyyy-MM-dd HH:mm:ss",
"yyyyMMddhhmmss",
"yyyyMMddhhmm",
"yyyyMMdd"
现在,我需要接受字符串,找出它属于这些格式,然后获取时间在epoch。
Now, i need to take the string, figure out it belongs to which of these formats, then get the time in epoch.
您可以建议一种方法。代码示例将是非常有帮助的。
我正在使用Boost库。让我知道如果这可以通过boost日期/时间解析库来实现。
Can you suggest a way to do this. Code samples will be really helpful. I am banking on Boost libraries. Let me know if this can be achieved by boost date/time parsing libraries.
提前感谢
AJ
Thanks in advance, AJ
推荐答案
我想你可以尝试使用这些格式将字符串转换为ptime并选择不会导致 not_a_date_time
。:
I suppose you could attempt to convert your string into ptime using each of these formats and pick the ones that do not result in a not_a_date_time
.:
升级格式标记与您的略有不同,我将仅为此示例执行最后五个操作:
The boost format flags are slightly different from yours, I'll do just the last five for this example:
#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
using boost::posix_time::time_input_facet;
using std::locale;
const locale inputs[] = {
locale(locale::classic(), new time_input_facet("%m/%d/%Y")),
locale(locale::classic(), new time_input_facet("%Y-%m-%d %H:%M:%S")),
locale(locale::classic(), new time_input_facet("%Y%m%d%H%M%S")),
locale(locale::classic(), new time_input_facet("%Y%m%d%H%M")),
locale(locale::classic(), new time_input_facet("%Y%m%d")) };
const size_t formats = sizeof(inputs)/sizeof(inputs[0]);
time_t ptime_to_time_t(boost::posix_time::ptime t)
{
static boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
return (t-epoch).ticks() / boost::posix_time::time_duration::ticks_per_second();
}
int main()
{
std::string msg = "2010-08-04 08:34:12";
for(size_t i=0; i<formats; ++i)
{
std::istringstream ss(msg);
ss.imbue(inputs[i]);
boost::posix_time::ptime this_time;
ss >> this_time;
if(this_time != boost::posix_time::not_a_date_time)
std::cout << this_time << " or " << ptime_to_time_t(this_time) << std::endl;
}
}
这篇关于C ++中的日期/时间解析(任何格式字符串到Epoch)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!