mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-03 16:02:26 +00:00
fix ConvertUtcToLocalTime,RtcConvertLocalTimeToUtc
This commit is contained in:
parent
ee3cf93973
commit
67350b17dc
@ -80,7 +80,7 @@ int PS4_SYSV_ABI sceRtcConvertLocalTimeToUtc(OrbisRtcTick* pTickLocal, OrbisRtcT
|
|||||||
|
|
||||||
if (convertValue >= 0) {
|
if (convertValue >= 0) {
|
||||||
convertValue = sceRtcTickAddMinutes(
|
convertValue = sceRtcTickAddMinutes(
|
||||||
pTickUtc, pTickLocal, -((timezone.tz_dsttime + timezone.tz_minuteswest) / 60));
|
pTickUtc, pTickLocal, -(((timezone.tz_dsttime * 60) - timezone.tz_minuteswest)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return convertValue;
|
return convertValue;
|
||||||
@ -95,29 +95,13 @@ int PS4_SYSV_ABI sceRtcConvertUtcToLocalTime(OrbisRtcTick* pTickUtc, OrbisRtcTic
|
|||||||
time_t seconds;
|
time_t seconds;
|
||||||
Kernel::OrbisTimesec timezone;
|
Kernel::OrbisTimesec timezone;
|
||||||
|
|
||||||
int convertValue = Kernel::sceKernelConvertUtcToLocaltime(
|
Kernel::OrbisKernelTimezone timeZone;
|
||||||
(pTickUtc->tick + 0xff23400100d44000U) / 1000000, &seconds, &timezone, 0);
|
int returnValue = Kernel::sceKernelGettimezone(&timeZone);
|
||||||
|
|
||||||
if (convertValue >= 0) {
|
sceRtcTickAddMinutes(pTickLocal, pTickUtc,
|
||||||
auto newTime = ((timezone.dst_sec + timezone.west_sec) / 60) * 60000000;
|
-(timeZone.tz_minuteswest - (timeZone.tz_dsttime * 60)));
|
||||||
|
|
||||||
if (pTickLocal == nullptr)
|
return 0;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceRtcEnd() {
|
int PS4_SYSV_ABI sceRtcEnd() {
|
||||||
@ -471,14 +455,13 @@ int PS4_SYSV_ABI sceRtcSetDosTime(OrbisRtcDateTime* pTime, u32 dosTime) {
|
|||||||
pTime->microsecond = 0;
|
pTime->microsecond = 0;
|
||||||
pTime->second = (dosTime << 1) & 0x3e;
|
pTime->second = (dosTime << 1) & 0x3e;
|
||||||
pTime->minute = (dosTime >> 5) & 0x3f;
|
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->day = days & 0x1f;
|
||||||
pTime->month = (days >> 5) & 0xf;
|
pTime->month = (days >> 5) & 0x0f;
|
||||||
pTime->year = (days >> 9) + 0x7bc;
|
pTime->year = (days >> 9) + 1980;
|
||||||
|
|
||||||
return SCE_OK;
|
return SCE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -559,13 +542,13 @@ int PS4_SYSV_ABI sceRtcSetTime_t(OrbisRtcDateTime* pTime, time_t llTime) {
|
|||||||
return SCE_OK;
|
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");
|
LOG_TRACE(Lib_Rtc, "called");
|
||||||
|
|
||||||
if (pTime == nullptr)
|
if (pTime == nullptr)
|
||||||
return ORBIS_RTC_ERROR_INVALID_POINTER;
|
return ORBIS_RTC_ERROR_INVALID_POINTER;
|
||||||
|
|
||||||
u64 convertedTime = (ulWin32Time / 10) + 0xb36168b6a58000;
|
u64 convertedTime = (ulWin32Time / 10) + WIN32_FILETIME_EPOCH_TICKS;
|
||||||
|
|
||||||
OrbisRtcTick convertedTick;
|
OrbisRtcTick convertedTick;
|
||||||
convertedTick.tick = convertedTime;
|
convertedTick.tick = convertedTime;
|
||||||
|
@ -20,6 +20,7 @@ constexpr int ORBIS_RTC_DAYOFWEEK_FRIDAY = 5;
|
|||||||
constexpr int ORBIS_RTC_DAYOFWEEK_SATURDAY = 6;
|
constexpr int ORBIS_RTC_DAYOFWEEK_SATURDAY = 6;
|
||||||
|
|
||||||
constexpr int64_t UNIX_EPOCH_TICKS = 0xdcbffeff2bc000;
|
constexpr int64_t UNIX_EPOCH_TICKS = 0xdcbffeff2bc000;
|
||||||
|
constexpr int64_t WIN32_FILETIME_EPOCH_TICKS = 0xb36168b6a58000;
|
||||||
|
|
||||||
struct OrbisRtcTick {
|
struct OrbisRtcTick {
|
||||||
uint64_t tick;
|
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 sceRtcSetDosTime(OrbisRtcDateTime* pTime, u32 dosTime);
|
||||||
int PS4_SYSV_ABI sceRtcSetTick(OrbisRtcDateTime* pTime, OrbisRtcTick* pTick);
|
int PS4_SYSV_ABI sceRtcSetTick(OrbisRtcDateTime* pTime, OrbisRtcTick* pTick);
|
||||||
int PS4_SYSV_ABI sceRtcSetTime_t(OrbisRtcDateTime* pTime, time_t llTime);
|
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 sceRtcTickAddDays(OrbisRtcTick* pTick1, OrbisRtcTick* pTick2, int32_t lAdd);
|
||||||
int PS4_SYSV_ABI sceRtcTickAddHours(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,
|
int PS4_SYSV_ABI sceRtcTickAddMicroseconds(OrbisRtcTick* pTick1, OrbisRtcTick* pTick2,
|
||||||
|
Loading…
Reference in New Issue
Block a user