[PSP] Problema con time() en C. Siempre devuelve 1/1/1970!

Hola amigos,

soy el desarrollador de la herramienta que sirve para localizar satélites llamado SatFinder Portable. Es un Homebrew hecho en lua que podeis conseguir por muy poco que busqueis.

El tema es que estoy portandolo a C, y el primer problema que me he encontrado, despues de instalarme el toolchain, cygwin, etc., es que cuando le pido la fecha y la hora en un programa, me devuelve la hora correcta, pero la fecha siempre la del 1 de Enero de 1970!. Si no soluciono esto no puedo avanzar.

Este sería un codigo chorra para obtener por pantalla la fecha. Si alguno tiene el entorno instalado y tal, podría probar a compilarlo y ver que le sale?

Un saludo! y muchas gracias por adelantado por la ayuda que podais darme.

//------------------

//Basic includes
#include
#include
//Display include
#include
//Controls include
#include
#include

PSP_MODULE_INFO("Ejemplo", 0, 1, 1);

#define printf pspDebugScreenPrintf

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
int cbid;

cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);

sceKernelSleepThreadCB();

return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
int thid = 0;

thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}

return thid;
}

/* Main */
int main() {
// Initialization functions
pspDebugScreenInit();
SetupCallbacks();



SceCtrlData pad;
printf("Pulsa X para comenzar...");

while(1) {
sceCtrlReadBufferPositive(&pad, 1);
if(pad.Buttons & PSP_CTRL_CROSS) {
break;
}
}

pspDebugScreenClear();

time_t rawtime;
struct tm * timeinfo;

time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ( "Current local time and date: %s", asctime (timeinfo) );


while(1) {
sceCtrlReadBufferPositive(&pad, 1);
if(pad.Buttons & PSP_CTRL_CIRCLE) {
break;
}
}

// Sleep the PSP till press HOME and exit.
sceKernelSleepThread();
return 0;

}
a mi me ha devuelto bien la hora y la fecha, lo unico que la hora me la devuelve en GMT y no en CET
Encontré la solución al problema.

Hay que usar esta función para que te devuelva bien la fecha:

sceKernelLibcTime();


Hay que añadir estos includes:

#include
#include


Y por tanto así se obtiene la fecha y hora:

struct tm *timevalues;
time_t rawtime;

sceKernelLibcTime(&rawtime);

timevalues = gmtime ( &rawtime );
timevalues->tm_year+=1900;
timevalues->tm_mon++;
timevalues->tm_isdst = currentDST;
return timevalues;

Si quieres la hora local solo tienes que cambiar la funcion gmtime() por localtime() que tienen los mismo argumentos.

En esta fecha que devuelve tengo que corregir ciertos valores, como el año, que es a partir de 1900, con lo cual le sumo 1900 para que sea el año actual con 4 dígitos. Al més le sumo 1, para que 1 sea enero, 2 febrero, etc...

La información referente a si estamos en horario de verano o no, no viene reflejada en timevalues->tm_isdst, que siempre vale 0. Para ello, hay usar esta funcion:



int GetDaylightSavingTime(){
int dst;

if (sceUtilityGetSystemParamInt( PSP_SYSTEMPARAM_ID_INT_DAYLIGHTSAVINGS, &dst ) == PSP_SYSTEMPARAM_RETVAL_OK){
currentDST = dst;
return dst;
}
else {
return 0;
}
}

Si localtime() no funcionara, devolviendo la hora universal igualmente, podemos obtener la diferencia horaria de la PSP con el siguiente procedimiento:

double GetUtcOffset(){
int utcOffset;

if (sceUtilityGetSystemParamInt( PSP_SYSTEMPARAM_ID_INT_TIMEZONE, &utcOffset ) == PSP_SYSTEMPARAM_RETVAL_OK){
currentUtcOffset = utcOffset/60.0;
return utcOffset/60.0;
}
else {
return 0;
}
}

Saludos, y que sepais que esto es código fuente de SatFinder Portable, que pronto estará disponible.
2 respuestas