fix ConvertUtcToLocalTime,RtcConvertLocalTimeToUtc

This commit is contained in:
CrazyBloo 2024-09-04 21:11:38 -04:00
parent ee3cf93973
commit 67350b17dc
2 changed files with 14 additions and 30 deletions

View file

@ -80,7 +80,7 @@ int PS4_SYSV_ABI sceRtcConvertLocalTimeToUtc(OrbisRtcTick* pTickLocal, OrbisRtcT
if (convertValue >= 0) {
convertValue = sceRtcTickAddMinutes(
pTickUtc, pTickLocal, -((timezone.tz_dsttime + timezone.tz_minuteswest) / 60));
pTickUtc, pTickLocal, -(((timezone.tz_dsttime * 60) - timezone.tz_minuteswest)));
}
return convertValue;
@ -95,29 +95,13 @@ int PS4_SYSV_ABI sceRtcConvertUtcToLocalTime(OrbisRtcTick* pTickUtc, OrbisRtcTic
time_t seconds;
Kernel::OrbisTimesec timezone;
int convertValue = Kernel::sceKernelConvertUtcToLocaltime(
(pTickUtc->tick + 0xff23400100d44000U) / 1000000, &seconds, &timezone, 0);
Kernel::OrbisKernelTimezone timeZone;
int returnValue = Kernel::sceKernelGettimezone(&timeZone);
if (convertValue >= 0) {
auto newTime = ((timezone.dst_sec + timezone.west_sec) / 60) * 60000000;
sceRtcTickAddMinutes(pTickLocal, pTickUtc,
-(timeZone.tz_minuteswest - (timeZone.tz_dsttime * 60)));
if (pTickLocal == nullptr)
return ORBIS_RTC_ERROR_INVALID_POINTER;
if (newTime < 0) {
if (pTickUtc->tick < -newTime) {
return ORBIS_RTC_ERROR_INVALID_VALUE;
}
} else {
if ((pTickUtc->tick + newTime) < pTickUtc->tick) {
return ORBIS_RTC_ERROR_INVALID_VALUE;
}
}
pTickLocal->tick = pTickUtc->tick + newTime;
convertValue = 0;
}
return convertValue;
return 0;
}
int PS4_SYSV_ABI sceRtcEnd() {
@ -471,14 +455,13 @@ int PS4_SYSV_ABI sceRtcSetDosTime(OrbisRtcDateTime* pTime, u32 dosTime) {
pTime->microsecond = 0;
pTime->second = (dosTime << 1) & 0x3e;
pTime->minute = (dosTime >> 5) & 0x3f;
pTime->hour = ((dosTime & 0xf800) >> 0xb);
pTime->hour = (dosTime & 0xf800) >> 0xb;
int days = (dosTime >> 0x10);
int16_t days = dosTime >> 0x10;
pTime->day = days & 0x1f;
pTime->month = (days >> 5) & 0xf;
pTime->year = (days >> 9) + 0x7bc;
pTime->month = (days >> 5) & 0x0f;
pTime->year = (days >> 9) + 1980;
return SCE_OK;
}
@ -559,13 +542,13 @@ int PS4_SYSV_ABI sceRtcSetTime_t(OrbisRtcDateTime* pTime, time_t llTime) {
return SCE_OK;
}
int PS4_SYSV_ABI sceRtcSetWin32FileTime(OrbisRtcDateTime* pTime, uint64_t ulWin32Time) {
int PS4_SYSV_ABI sceRtcSetWin32FileTime(OrbisRtcDateTime* pTime, int64_t ulWin32Time) {
LOG_TRACE(Lib_Rtc, "called");
if (pTime == nullptr)
return ORBIS_RTC_ERROR_INVALID_POINTER;
u64 convertedTime = (ulWin32Time / 10) + 0xb36168b6a58000;
u64 convertedTime = (ulWin32Time / 10) + WIN32_FILETIME_EPOCH_TICKS;
OrbisRtcTick convertedTick;
convertedTick.tick = convertedTime;

View file

@ -20,6 +20,7 @@ constexpr int ORBIS_RTC_DAYOFWEEK_FRIDAY = 5;
constexpr int ORBIS_RTC_DAYOFWEEK_SATURDAY = 6;
constexpr int64_t UNIX_EPOCH_TICKS = 0xdcbffeff2bc000;
constexpr int64_t WIN32_FILETIME_EPOCH_TICKS = 0xb36168b6a58000;
struct OrbisRtcTick {
uint64_t tick;
@ -74,7 +75,7 @@ int PS4_SYSV_ABI sceRtcSetCurrentTick();
int PS4_SYSV_ABI sceRtcSetDosTime(OrbisRtcDateTime* pTime, u32 dosTime);
int PS4_SYSV_ABI sceRtcSetTick(OrbisRtcDateTime* pTime, OrbisRtcTick* pTick);
int PS4_SYSV_ABI sceRtcSetTime_t(OrbisRtcDateTime* pTime, time_t llTime);
int PS4_SYSV_ABI sceRtcSetWin32FileTime(OrbisRtcDateTime* pTime, uint64_t ulWin32Time);
int PS4_SYSV_ABI sceRtcSetWin32FileTime(OrbisRtcDateTime* pTime, int64_t ulWin32Time);
int PS4_SYSV_ABI sceRtcTickAddDays(OrbisRtcTick* pTick1, OrbisRtcTick* pTick2, int32_t lAdd);
int PS4_SYSV_ABI sceRtcTickAddHours(OrbisRtcTick* pTick1, OrbisRtcTick* pTick2, int32_t lAdd);
int PS4_SYSV_ABI sceRtcTickAddMicroseconds(OrbisRtcTick* pTick1, OrbisRtcTick* pTick2,