以ISO 8601格式输出日期

时间:2016-04-29 00:31:08

标签: c++

如何在C ++中以下列格式获取日期:

SELECT 
    ShopOrder.OrderDate, Book.BookID, Book.title, 
    COUNT(ShopOrder.ShopOrderID) AS "Total number of order", 
    SUM (Orderline.Quantity) AS "Total quantity", 
    Orderline.UnitSellingPrice * Orderline.Quantity AS "Total order value", 
    Book.Price * OrderLine.Quantity AS "Total retail value" 
FROM 
    ShopOrder, Publisher, Book, Orderline 
WHERE 
    Publisher.name = 'Penguin Books' 
    AND ShopOrder.ShopOrderID = Orderline.ShopOrderID 
    AND Book.BookID = Orderline.BookID 
    AND Publisher.PublisherID = Book.PublisherID 
ORDER BY 
    ShopOrder.OrderDate; 

输出为2016-04-26T19:50:48Z #include <chrono> #include <ctime> time_t _tm = time(NULL); struct tm*curtime = localtime(&_tm);

当前输出为:asctime(curtime)

3 个答案:

答案 0 :(得分:9)

Documentation是你的朋友:

std::time_t t
    = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
std::cout << std::put_time( std::localtime( &t ), "%FT%T%z" );

在我的系统中产生

2016-04-29T02:48:56+0200

答案 1 :(得分:2)

我将为我提供日历值的std::localtime与为我提供精确方法的std::chrono函数结合在一起。这是我的代码:

#include <ctime>
#include <chrono>

...

auto now = std::chrono::system_clock::now();
auto now_c = std::chrono::system_clock::to_time_t(now)
auto now_tm = std::localtime(&now_c);
auto now_since_epoch = now.time_since_epoch();    // since 1970
auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(now_since_epoch).count();

std::cout << std::setfill('0') <<
    std::setw(4) << now_tm->tm_year + 1900 << '-' <<
    std::setw(2) << now_tm->tm_mon + 1 << '-' <<
    std::setw(2) << now_tm->tm_mday << 'T' <<
    std::setw(2) << now_ms % (24*60*60*1000) << ':' <<
    std::setw(2) << now_ms % (60*60*1000) << ':' <<
    std::setw(2) << now_ms % (60*1000) << '.' <<
    std::setw(3) << now_ms % (1000);

虽然很冗长,但实际上做起来还不如strftime。

答案 2 :(得分:1)

基于@Uri的答案,该答案修复了一些错误,并以ISO8601格式的毫秒数显示了正确时区中的时间:

auto now = std::chrono::system_clock::now();
std::time_t time = std::chrono::system_clock::to_time_t(now);
std::tm* now_tm = std::localtime(&time);
long long timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();

std::cout << std::setfill('0') 
          << std::put_time(now_tm, "%FT%H:%M:")
          << std::setw(2) << (timestamp / 1000) % 60 << '.'
          << std::setw(3) << timestamp % 1000
          << std::put_time(now_tm, "%z");
相关问题