Как мне построить дату и время ISO 8601 в C ++? - PullRequest
37 голосов
/ 02 марта 2012

Я работаю с API-интерфейсом REST Azure, и они используют его для создания тела запроса для хранения таблицы:

DateTime.UtcNow.ToString("o")

, которое выдает:

2012-03-02T04: 07: 34.0218628Z

Это называется «туда-обратно» и, очевидно, это стандарт ISO (см. http://en.wikipedia.org/wiki/ISO_8601), но я не знаю, как его повторить после прочтениястатья вики.

Кто-нибудь знает, если Boost имеет поддержку для этого, или, возможно, Qt ?

Ответы [ 7 ]

62 голосов
/ 02 марта 2012

Если время до ближайшей секунды достаточно точное, вы можете использовать strftime:

#include <ctime>
#include <iostream>

int main() {
    time_t now;
    time(&now);
    char buf[sizeof "2011-10-08T07:07:09Z"];
    strftime(buf, sizeof buf, "%FT%TZ", gmtime(&now));
    // this will work too, if your compiler doesn't support %F or %T:
    //strftime(buf, sizeof buf, "%Y-%m-%dT%H:%M:%SZ", gmtime(&now));
    std::cout << buf << "\n";
}

Если вам нужна большая точность, вы можете использовать Boost:

#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>

int main() {
    using namespace boost::posix_time;
    ptime t = microsec_clock::universal_time();
    std::cout << to_iso_extended_string(t) << "Z\n";
}
23 голосов
/ 29 апреля 2017

Использование библиотеки date (C ++ 11):

template <class Precision>
string getISOCurrentTimestamp()
{
    auto now = chrono::system_clock::now();
    return date::format("%FT%TZ", date::floor<Precision>(now));
}

Пример использования:

cout << getISOCurrentTimestamp<chrono::seconds>();
cout << getISOCurrentTimestamp<chrono::milliseconds>();
cout << getISOCurrentTimestamp<chrono::microseconds>();

Выход:

2017-04-28T15:07:37Z
2017-04-28T15:07:37.035Z
2017-04-28T15:07:37.035332Z
4 голосов
/ 13 апреля 2016

Я должен отметить, что я новичок в C ++.

Мне нужна была строка с датой и временем в формате UTC ISO 8601, включающая миллисекунды. У меня не было доступа к надстройке.

Это скорее взлом, чем решение, но для меня это сработало достаточно.

std::string getTime()
{
    timeval curTime;
    time_t now;

    time(&now);
    gettimeofday(&curTime, NULL);

    int milli = curTime.tv_usec / 1000;
    char buf[sizeof "2011-10-08T07:07:09"];
    strftime(buf, sizeof buf, "%FT%T", gmtime(&now));
    sprintf(buf, "%s.%dZ", buf, milli);

    return buf;
}

Вывод выглядит так: 2016-04-13T06: 53: 15.485Z

2 голосов
/ 21 октября 2013

ОК, поэтому я изменил несколько решений, которые я нашел, и предложил следующее:

static QString getTimeZoneOffset()
{
    QDateTime dt1 = QDateTime::currentDateTime();
    QDateTime dt2 = dt1.toUTC();
    dt1.setTimeSpec(Qt::UTC);

int offset = dt2.secsTo(dt1) / 3600;
if (offset >= 0)
    return QString("%1").arg(offset).rightJustified(2, '0',true).prepend("+");
return QString("%1").arg(offset).rightJustified(2, '0',true);
}

Затем легко отформатировать дату ( гггг-мм-дд'ТЧЧ: мм: сс.СССЗ ):

static QString toISO8601ExtendedFormat(QDateTime date)
{
    QString dateAsString = date.toString(Qt::ISODate);
    QString timeOffset =  Define::getTimeZoneOffset();
    qDebug() << "dateAsString :" << dateAsString;
    qDebug() << "timeOffset :" << timeOffset;
    timeOffset = QString(".000%1%2").arg(timeOffset).arg("00");
    qDebug() << "timeOffset replaced :" << timeOffset;
    if(dateAsString.contains("Z",Qt::CaseInsensitive))
        dateAsString = dateAsString.replace("Z",timeOffset);
    else
        dateAsString = dateAsString.append(timeOffset);
        qDebug() << "dateAsString :" << dateAsString;
    return dateAsString;
}

Например, GMT +2 будет выглядеть так: 2013-10-14T00: 00: 00.000 + 0200

2 голосов
/ 02 марта 2012

В Qt это будет:

QDateTime dt = QDateTime::currentDateTime();
dt.setTimeSpec(Qt::UTC);  // or Qt::OffsetFromUTC for offset from UTC
qDebug() << QDateTime::currentDateTime().toString(Qt::ISODate);
2 голосов
/ 02 марта 2012

Boost имеет библиотеку для этого.

т.е. posix_time имеет функции from_iso_string() и to_iso_string().

0 голосов
/ 05 марта 2012

Понравилось ли это так:

using namespace boost::posix_time;
ptime t = microsec_clock::universal_time();
qDebug() << QString::fromStdString(to_iso_extended_string(t) + "0Z"); // need 7 digits
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...