C++ 将日期和时间字符串转换为C++;

C++ 将日期和时间字符串转换为C++;,c++,C++,如何转换 std::string strdate=“2012-06-25 05:32:06.963” 像这样的事情 std::string strintdate=“20120625053206963”//i基本上删除了-、:、空格和 我想我应该使用strtok或string函数,但我不能这样做,请任何人在这里帮助我使用sampel代码 所以我使用 // crt_strtoui64.c #include <stdio.h> unsigned __int64 atoui64(const

如何转换

std::string strdate=“2012-06-25 05:32:06.963”

像这样的事情

std::string strintdate=“20120625053206963”//i基本上删除了-、:、空格和

我想我应该使用strtok或string函数,但我不能这样做,请任何人在这里帮助我使用sampel代码

所以我使用

// crt_strtoui64.c
#include <stdio.h>

unsigned __int64 atoui64(const char *szUnsignedInt) {
   return _strtoui64(szUnsignedInt, NULL, 10);
}

int main() {
   unsigned __int64 u = atoui64("18446744073709551615");
   printf( "u = %I64u\n", u );
}
//crt\u stroui64.c
#包括
无符号_int64 atoui64(常量字符*szUnsignedInt){
返回_stroui64(szUnsignedInt,NULL,10);
}
int main(){
未签名的uuu int64 u=atoui64(“18446744073709551615”);
printf(“u=%I64u\n”,u);
}

使用字符串替换将不需要的字符替换为无字符

使用字符串替换将不需要的字符替换为无字符

bool非数字(字符c){
返回c<'0'| c>'9';
}
std::string strdate=“2012-06-25 05:32:06.963”;
标准擦除(
std::remove_if(strdate.begin()、strdate.end()、非数字),
strdate.end()
);
std::istringstream ss(标准日期);
无符号_uint64结果;
如果(ss>>结果){
//成功
}否则{
//处理失败
}
顺便说一句,您的64位int表示可能有点脆弱。确保将日期/时间
2012-06-25 05:32:06
输入为
2012-06-25 05:32:06.000
,否则从末尾得到的整数比预期的小(因此可能会混淆为公元2年的日期/时间)。

bool nondigit(字符c){
返回c<'0'| c>'9';
}
std::string strdate=“2012-06-25 05:32:06.963”;
标准擦除(
std::remove_if(strdate.begin()、strdate.end()、非数字),
strdate.end()
);
std::istringstream ss(标准日期);
无符号_uint64结果;
如果(ss>>结果){
//成功
}否则{
//处理失败
}
顺便说一句,您的64位int表示可能有点脆弱。确保将日期/时间
2012-06-25 05:32:06
输入为
2012-06-25 05:32:06.000
,否则从结尾处得到的整数小于预期值(因此可能会混淆为公元2年的日期/时间)。

给你:

bool not_digit (int c) { return !std::isdigit(c); }

std::string date="2012-06-25 05:32:06.963";
// construct a new string
std::string intdate(date.begin(), std::remove_if(date.begin(), date.end(), not_digit));
给你:

bool not_digit (int c) { return !std::isdigit(c); }

std::string date="2012-06-25 05:32:06.963";
// construct a new string
std::string intdate(date.begin(), std::remove_if(date.begin(), date.end(), not_digit));

我不会用斯特克。下面是一个相当简单的方法,它只使用
std::string
成员函数:

std::string strdate = "2012-06-25 05:32:06.963";
size_t pos = strdate.find_first_not_of("1234567890");
while (pos != std::string::npos)
{
    size_t endpos = strdate.find_first_of("1234567890", pos);
    strdate.erase(pos, endpos - pos);
    pos = strdate.find_first_not_of("1234567890");
}
这不是一个超级高效的方法,但它会起作用

可能更有效的方法是使用stringstream

std::string strdate = "2012-06-25 05:32:06.963";

std::stringstream out;

for (auto i = strdate.begin(); i != strdate.end(); i++)
    if (std::isdigit(*i)) out << *i;

strdate = out.str();
std::string strdate=“2012-06-25 05:32:06.963”;
std::stringout;
for(自动i=strdate.begin();i!=strdate.end();i++)

如果(std::isdigit(*i))out我就不会使用strtok。下面是一个相当简单的方法,它只使用
std::string
成员函数:

std::string strdate = "2012-06-25 05:32:06.963";
size_t pos = strdate.find_first_not_of("1234567890");
while (pos != std::string::npos)
{
    size_t endpos = strdate.find_first_of("1234567890", pos);
    strdate.erase(pos, endpos - pos);
    pos = strdate.find_first_not_of("1234567890");
}
这不是一个超级高效的方法,但它会起作用

可能更有效的方法是使用stringstream

std::string strdate = "2012-06-25 05:32:06.963";

std::stringstream out;

for (auto i = strdate.begin(); i != strdate.end(); i++)
    if (std::isdigit(*i)) out << *i;

strdate = out.str();
std::string strdate=“2012-06-25 05:32:06.963”;
std::stringout;
for(自动i=strdate.begin();i!=strdate.end();i++)

如果(std::isdigit(*i))输出如果编译器支持C++11功能:

#include <iostream>
#include <algorithm>
#include <string>

int main()
{
    std::string s("2012-06-25 05:32:06.963");
    s.erase(std::remove_if(s.begin(),
                           s.end(),
                           [](const char a_c) { return !isdigit(a_c); }),
            s.end());
    std::cout << s << "\n";
    return 0;
}
#包括
#包括
#包括
int main()
{
标准::字符串s(“2012-06-2505:32:06.963”);
s、 删除(标准::删除_如果(s.begin(),
s、 end(),
[](const char a_c){return!isdigit(a_c);}),
s、 end());

std::cout如果编译器支持C++11功能:

#include <iostream>
#include <algorithm>
#include <string>

int main()
{
    std::string s("2012-06-25 05:32:06.963");
    s.erase(std::remove_if(s.begin(),
                           s.end(),
                           [](const char a_c) { return !isdigit(a_c); }),
            s.end());
    std::cout << s << "\n";
    return 0;
}
#包括
#包括
#包括
int main()
{
标准::字符串s(“2012-06-2505:32:06.963”);
s、 删除(标准::删除_如果(s.begin(),
s、 end(),
[](const char a_c){return!isdigit(a_c);}),
s、 end());
std::cout
std::string strdate=“2012-06-25 05:32:06.963”;
std::string result=“”;
for(std::string::iterator itr=strdate.begin();itr!=strdate.end();itr++)
{
如果(itr[0]>='0'&&itr[0]
std::string strdate=“2012-06-25 05:32:06.963”;
std::string result=“”;
for(std::string::iterator itr=strdate.begin();itr!=strdate.end();itr++)
{

如果(itr[0]>='0'&&itr[0]在转换前使用循环并收集数字?或者在C++中使用正则表达式使用循环并在转换之前收集数字?或者在C++中使用正则表达式11@jrok:因为它是特定于语言环境的,而且我不记得
操作符>>
是否也是。还因为
isdigit
不接受负数输入,所以需要额外的强制转换和n额外的解释。不过,
中有
isdigit
的模板版本,这以成本为代价避免了后一个问题(无论如何,对我来说)另一种选择是删除发问者列出的5个字符,而不是对数字进行任何测试。这意味着有更多类型的错误输入最终会失败,这是好事还是坏事,取决于你是想捕捉错误输入,还是只想继续使用it并责怪给你错误输入的人:-)@jrok:因为它是特定于语言环境的,我不记得
operator>
是否也是。还因为
isdigit
不接受负面输入,所以需要额外的强制转换和解释。不过
中有
isdigit
的模板版本,这避免了后面的问题成本(无论如何,对我来说)另一种选择是删除发问者列出的5个字符,而不是对数字进行任何测试。这意味着有更多类型的错误输入最终会失败,这是好事还是坏事,取决于你是想捕捉错误输入,还是只想继续使用it并责怪给你错误输入的人:-)