From ff6ab9444addb22ff230db3f52dad37e635acbca Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Sun, 10 Aug 2025 19:04:50 +0200 Subject: [PATCH] Fix handling of RFC 3339 formatted dates (#3410) --- src/core/libraries/rtc/rtc.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/core/libraries/rtc/rtc.cpp b/src/core/libraries/rtc/rtc.cpp index 89be435c9..5d4e2beab 100644 --- a/src/core/libraries/rtc/rtc.cpp +++ b/src/core/libraries/rtc/rtc.cpp @@ -808,19 +808,25 @@ int PS4_SYSV_ABI sceRtcParseRFC3339(OrbisRtcTick* pTickUtc, const char* pszDateT dateTime.hour = std::stoi(dateTimeString.substr(11, 2)); dateTime.minute = std::stoi(dateTimeString.substr(14, 2)); dateTime.second = std::stoi(dateTimeString.substr(17, 2)); - dateTime.microsecond = std::stoi(dateTimeString.substr(20, 2)); + s32 timezone_pos = 22; + if (dateTimeString[19] == '.') { + dateTime.microsecond = std::stoi(dateTimeString.substr(20, 2)); + } else { + timezone_pos = 19; + dateTime.microsecond = 0; + } sceRtcGetTick(&dateTime, pTickUtc); - if (dateTimeString[22] != 'Z') { - if (dateTimeString[22] == '-') { - int timeZoneOffset = std::stoi(dateTimeString.substr(23, 2)) * 60; - timeZoneOffset += std::stoi(dateTimeString.substr(26, 2)); + if (dateTimeString[timezone_pos] != 'Z') { + if (dateTimeString[timezone_pos] == '-') { + int timeZoneOffset = std::stoi(dateTimeString.substr(timezone_pos + 1, 2)) * 60; + timeZoneOffset += std::stoi(dateTimeString.substr(timezone_pos + 4, 2)); timeZoneOffset *= -1; sceRtcTickAddMinutes(pTickUtc, pTickUtc, timeZoneOffset); - } else if (dateTimeString[22] == '+') { - int timeZoneOffset = std::stoi(dateTimeString.substr(23, 2)) * 60; - timeZoneOffset += std::stoi(dateTimeString.substr(26, 2)); + } else if (dateTimeString[timezone_pos] == '+') { + int timeZoneOffset = std::stoi(dateTimeString.substr(timezone_pos + 1, 2)) * 60; + timeZoneOffset += std::stoi(dateTimeString.substr(timezone_pos + 4, 2)); sceRtcTickAddMinutes(pTickUtc, pTickUtc, timeZoneOffset); } }