2012-03-02 18 views
27

Pracuję z API REST Azure i są one za to stworzyć ciało zapytanie do przechowywania tabeli:Jak skonstruować datetime ISO 8601 w C++?

DateTime.UtcNow.ToString("o") 

która produkuje:

2012-03-02T04: 07: +34,0218628 z

nazywa się „round-trip” i najwyraźniej jest to standard ISO (patrz http://en.wikipedia.org/wiki/ISO_8601), ale nie mam pojęcia, jak go powtórzyć po przeczytaniu artykułu wiki.

Czy ktoś wie, czy Boost ma wsparcie dla tego, lub ewentualnie Qt?

Uwaga: skontaktuję się z Tobą po weekendzie po porównaniu z C#.

Odpowiedz

51

Jeśli czas z dokładnością do sekundy jest wystarczająco precyzyjny, można użyć 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"; 
} 

Jeśli potrzebujesz więcej precyzji, można użyć 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"; 
} 
+8

Chcesz "% FT% TZ" (ISO 8601 używa "T" do oddzielenia daty od czasu.) –

3

W Qt, które byłyby:

QDateTime dt = QDateTime::currentDateTime(); 
dt.setTimeSpec(Qt::UTC); // or Qt::OffsetFromUTC for offset from UTC 
qDebug() << QDateTime::currentDateTime().toString(Qt::ISODate); 
+0

Numery na końcu to kwestia, a nie forma w łańcuchu – chikuba

+0

Masz na myśli ułamkową część sekund (tj. .0218628)? Są opcjonalne ... – Koying

+0

jak? nic nie widziałem w dokumencie – chikuba

0

Czy to tak:

using namespace boost::posix_time; 
ptime t = microsec_clock::universal_time(); 
qDebug() << QString::fromStdString(to_iso_extended_string(t) + "0Z"); // need 7 digits 
1

OK więc mam zmodyfikowano kilka rozwiązań, które znalazłem, jak wpadł na następujące :

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); 
} 

Wtedy łatwo sformatować datę (yyyy-mM-dd'T'GG: mm: ss.SSSZ):

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; 
} 

Na przykład GMT +2 będzie wyglądać następująco: 2013-10-14T00: 00: 00,000 + 0200

2

miejscu należy wskazać, Jestem C++ newb.

Potrzebowałem łańcucha z datownikiem w formacie ISO 8601 w formacie UTC w formacie ISO 8601, który obejmował milisekundy. Nie miałem dostępu do wzmocnienia.

To jest bardziej hack niż rozwiązanie, ale zadziałało wystarczająco dobrze dla mnie.

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; 
} 

Wyjście wygląda następująco: 2016-04-13T06: 53: 15.485Z

9

Używanie date bibliotekę C++ (11):

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

Przykład użycia:

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

wyjściowa:

2017-04-28T15:07:37Z 
2017-04-28T15:07:37.035Z 
2017-04-28T15:07:37.035332Z 
Powiązane problemy