diff --git a/src/time/ngage/SDL_systime.cpp b/src/time/ngage/SDL_systime.cpp index 44bcd23e8bdd3..03891b6f57533 100644 --- a/src/time/ngage/SDL_systime.cpp +++ b/src/time/ngage/SDL_systime.cpp @@ -171,20 +171,39 @@ bool SDL_GetCurrentTime(SDL_Time *ticks) bool SDL_TimeToDateTime(SDL_Time ticks, SDL_DateTime *dt, bool localTime) { + TTime ticks_time; + TTime universal_time; + TTimeIntervalMicroSeconds offset; + TDateTime date_time; + TDateTime universal_date_time; + TInt64 ticks_div; + TInt64 ticks_div_d_64; + TInt64 ticks_div_r; + SDL_Time ticks_div_d; + CHECK_PARAM(!dt) { return SDL_InvalidParamError("dt"); } - // FIXME: Need implementation - dt->year = 1970; - dt->month = 1; - dt->day = 1; - dt->hour = 0; - dt->minute = 0; - dt->second = 0; - dt->nanosecond = 0; - dt->day_of_week = 4; - dt->utc_offset = 0; + ticks_time = UnixEpoch(); + ticks_div = TInt64((TUint)(ticks >> 32), (TUint)ticks); + ticks_div_d = 1000; + ticks_div_d_64 = TInt64((TUint)(ticks_div_d >> 32), (TUint)ticks_div_d); + ticks_div.DivMod(ticks_div_d_64, ticks_div_r); + offset = TTimeIntervalMicroSeconds(ticks_div); + ticks_time += offset; + date_time = ticks_time.DateTime(); + universal_time.UniversalTime(); + universal_date_time = universal_time.DateTime(); + dt->year = date_time.Year(); + dt->month = date_time.Month() + 1; + dt->day = date_time.Day() + 1; + dt->hour = date_time.Hour(); + dt->minute = date_time.Minute(); + dt->second = date_time.Second(); + dt->nanosecond = date_time.MicroSecond() * 1000; + dt->day_of_week = ticks_time.DayNoInWeek() + 1; + dt->utc_offset = universal_date_time.Second() - date_time.Second(); return true; }