in src/aws-cpp-sdk-core/source/utils/DateTimeCommon.cpp [1418:1503]
void DateTime::ConvertTimestampStringToTimePoint(const char* timestamp, DateFormat format)
{
std::tm timeStruct;
bool isUtc = true;
switch (format)
{
case DateFormat::RFC822:
{
RFC822DateParser parser(timestamp);
parser.Parse();
m_valid = parser.WasParseSuccessful();
isUtc = parser.ShouldIAssumeThisIsUTC();
timeStruct = parser.GetParsedTimestamp();
break;
}
case DateFormat::ISO_8601:
{
ISO_8601DateParser parser(timestamp);
parser.Parse();
m_valid = parser.WasParseSuccessful();
isUtc = parser.ShouldIAssumeThisIsUTC();
timeStruct = parser.GetParsedTimestamp();
break;
}
case DateFormat::ISO_8601_BASIC:
{
ISO_8601BasicDateParser parser(timestamp);
parser.Parse();
m_valid = parser.WasParseSuccessful();
isUtc = parser.ShouldIAssumeThisIsUTC();
timeStruct = parser.GetParsedTimestamp();
break;
}
case DateFormat::AutoDetect:
{
RFC822DateParser rfcParser(timestamp);
rfcParser.Parse();
if(rfcParser.WasParseSuccessful())
{
m_valid = true;
isUtc = rfcParser.ShouldIAssumeThisIsUTC();
timeStruct = rfcParser.GetParsedTimestamp();
break;
}
ISO_8601DateParser isoParser(timestamp);
isoParser.Parse();
if (isoParser.WasParseSuccessful())
{
m_valid = true;
isUtc = isoParser.ShouldIAssumeThisIsUTC();
timeStruct = isoParser.GetParsedTimestamp();
break;
}
ISO_8601BasicDateParser isoBasicParser(timestamp);
isoBasicParser.Parse();
if (isoBasicParser.WasParseSuccessful())
{
m_valid = true;
isUtc = isoBasicParser.ShouldIAssumeThisIsUTC();
timeStruct = isoBasicParser.GetParsedTimestamp();
break;
}
m_valid = false;
break;
}
default:
assert(0);
}
if (m_valid)
{
std::time_t tt;
if(isUtc)
{
tt = Aws::Time::TimeGM(&timeStruct);
}
else
{
assert(0);
AWS_LOGSTREAM_WARN(CLASS_TAG, "Non-UTC timestamp detected. This is always a bug. Make the world a better place and fix whatever sent you this timestamp: " << timestamp)
tt = std::mktime(&timeStruct);
}
m_time = std::chrono::system_clock::from_time_t(tt);
}
}