Je travaille avec Azure REST API et ils l'utilisent pour créer le corps de la demande pour le stockage de table:
DateTime.UtcNow.ToString("o")
Ce qui produit:
2012-03-02T04: 07: 34.0218628Z
Cela s'appelle "aller-retour" et apparemment c'est une norme ISO (voir http://en.wikipedia.org/wiki/ISO_8601 ) mais je ne sais pas comment le reproduire après avoir lu le wiki article.
Est-ce que quelqu'un sait si Boost a un support pour cela, ou peut-être Qt ?
Si le temps à la seconde près est suffisamment précis, vous pouvez utiliser 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";
}
Si vous avez besoin de plus de précision, vous pouvez utiliser 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";
}
Utilisation de la bibliothèque date (C++ 11):
template <class Precision>
string getISOCurrentTimestamp()
{
auto now = chrono::system_clock::now();
return date::format("%FT%TZ", date::floor<Precision>(now));
}
Exemple d'utilisation:
cout << getISOCurrentTimestamp<chrono::seconds>();
cout << getISOCurrentTimestamp<chrono::milliseconds>();
cout << getISOCurrentTimestamp<chrono::microseconds>();
Production:
2017-04-28T15:07:37Z
2017-04-28T15:07:37.035Z
2017-04-28T15:07:37.035332Z
Je dois souligner que je suis un newb C++.
J'avais besoin d'une chaîne avec une date et une heure au format UTC ISO 8601 qui comprenait des millisecondes. Je n'avais pas accès au boost.
C'est plus un hack qu'une solution, mais cela a assez bien fonctionné pour moi.
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;
}
La sortie ressemble à: 2016-04-13T06: 53: 15.485Z
Dans Qt, ce serait:
QDateTime dt = QDateTime::currentDateTime();
dt.setTimeSpec(Qt::UTC); // or Qt::OffsetFromUTC for offset from UTC
qDebug() << QDateTime::currentDateTime().toString(Qt::ISODate);
OK, j'ai donc modifié quelques solutions que j'ai trouvées, comme suit:
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);
}
Ensuite, pour formater facilement une date (aaaa-MM-jj'T'HH: 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;
}
Par exemple, GMT +2 ressemblerait à ceci: 2013-10-14T00: 00: 00.000 + 02
Boost a un bibliothèque pour cela.
C'est à dire. posix_time a les fonctions from_iso_string()
et to_iso_string()
.