C ++转换日期格式

时间:2012-12-31 08:55:16

标签: c++ date format data-conversion

我想将int日期转换为:

  

20111201

string

  

01DEC2011

C ++中是否内置了快速日期格式转换(或者我可以执行bash系统命令)来执行此操作,还是我在所有月份都无法进行切换?

4 个答案:

答案 0 :(得分:4)

您可以使用strptime将字符串转换为struct tm,然后使用strftime重新格式化它:

#include <ctime>
#include <iostream>
#include <sstream>

int main()
{
  std::ostringstream date1;
  date1 << 20111201;

  struct tm tm;
  strptime(date1.str().c_str(), "%Y%m%d", &tm);

  char date2[10];
  strftime(date2, sizeof(date2), "%d%b%Y", &tm);

  std::cout << date1.str() << " -> " << date2 << std::endl;
}

输出是:

20111201 -> 01Dec2011

如果有必要,只需将Dec转换为大写。

答案 1 :(得分:3)

不要在这里使用bash。要走的路是在C ++中使用Boost的原因比我在这里列出的时间更多,但最终它将与你将遇到的大多数其他解决方案一样快,除非你的功能绝对是时间关键,它赢了'无论如何都会产生很大的不同。

此外,它将比您经常遇到的那些糟糕的小型硬编码日期转换例程更加灵活和可维护。

以下代码将执行您想要的操作。

#include <iostream>
#include <sstream>

#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/algorithm/string.hpp>

using namespace boost::gregorian;
using namespace std;

int main(int argc, char **argv)
{
    int dateIn = 20111201;

    // Read the date in from ISO format as an int.
    ostringstream ss;
    ss << dateIn;
    date d(from_undelimited_string( ss.str() ));

    // Set the output format
    date_facet *fct = new date_facet("%d%b%Y");    // [1]
    locale loc = locale(locale::classic(), fct);

    // Render the date as a string;
    ss.str("");
    ss.imbue(loc);
    ss << d;
    string dateOut( ss.str() );
    boost::to_upper( dateOut );

    cout << dateOut << endl;
}

这给出了以下输出:

01DEC2011

只需在ref "%d%b%Y"处更改格式字符串[1],就会更改为不同的输出格式,但请记住我已将其转换为大写。

答案 2 :(得分:0)

由于这种日期格式,因此没有直接内置的内容 比较少见。这里最简单的解决方案是 使用%/将日期分解为年月日 运算符(例如月份为value / 100 % 100),然后格式化 通常使用std::ostream三个值,然后查找 在表格中的日期。 (这显然需要一些错误 检查,因为并非所有积分值都产生有效日期。)

答案 3 :(得分:0)

旧问题的新答案。此答案通过C ++ 11/14 tm库而不是C boost::date_time#include "tz.h" #include <iostream> #include <locale> #include <sstream> int main() { auto date1 = 20111201; std::stringstream stream; stream.exceptions(std::ios::failbit); stream << date1; std::chrono::system_clock::time_point tp; date::parse(stream, "%Y%m%d", tp); auto str = date::format("%d%b%Y", tp); auto& ct = std::use_facet<std::ctype<char>>(std::locale::classic()); ct.toupper(&str.front(), &str.back()+1); std::cout << str << '\n'; } 进行流量处理。否则它与现有答案非常相似。它需要free, open-source library来进行解析和格式化。

stream.exceptions(std::ios::failbit);

我已经包含了locale来大声检测无效的“整数日期”。我已经包含旧的C ++ 98代码将字符串转换为大写(最后是01DEC2011 舞蹈。)

auto date1 = 20111201093357.275L;

std::stringstream stream;
stream.exceptions(std::ios::failbit);
stream << std::fixed << date1;

std::chrono::system_clock::time_point tp;
date::parse(stream, "%Y%m%d%H%M%S", tp);

auto str = date::format("%d%b%Y %T", tp);

auto& ct = std::use_facet<std::ctype<char>>(std::locale::classic());
ct.toupper(&str.front(), &str.back()+1);
std::cout << str << '\n';

使用现代C ++日期/时间库的一个优点是可以轻松进行更改。例如,如果现在需要解析时间戳而不是日精度,但精度为毫秒级呢?以下是如何做到的:

01DEC2011 09:33:57.275000

输出:

parse

或许这些时间戳可能来自Chatham Island off the coast of New Zealand,你需要它们在UTC中。只需在tp = date::locate_zone("Pacific/Chatham")->to_sys(tp); 之后添加一行:

30NOV2011 19:48:57.275000

现在的输出是:

{{1}}

考虑到任意时区和亚秒级精度,目前超出了所有其他C ++库的功能。