| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
brito87
Registrado: 04 Nov 2007 Mensajes: 14
| Publicado: 22/11/2007 12:06 am | | | Título: Fechas Posteriores |
| Hola me gustaria saver si existe alguna forma de coger la fecha del sistema, pero no la actual, si no la de mañana, pasado y el posterior. ¿Esto es posible? Ya que la actual la consigo con esta función:
| Código: | //Funcion Fecha
time_t t; struct tm *stmf; char fecha[20]; t = time(NULL); stmf = localtime(&t); strftime(fecha,sizeof(fecha),"%d-%m-%Y",stmf); |
Gracias y espero la que tenga solución. |
| | Volver arriba | |  | mamntc02
Registrado: 30 Abr 2007 Mensajes: 277
| Publicado: 22/11/2007 8:17 am | | | Título: |
| Hola,
tienes varias maneras. Una de ellas, quizá la q más q gusta a mi , sería sumar los segundos q quieres añadir. Pej:
| Código: | /Funcion Fecha
time_t t; struct tm *stmf; char fecha[20]; t = time(NULL); t += 86400; // Añado 24 horas (en segundos) stmf = localtime(&t); strftime(fecha,sizeof(fecha),"%d-%m-%Y",stmf); |
Espero q fuese esto lo q querías. También puedes crearte tu la fecha q quieras, mediante una estructura tm, y añadir los datos manualmente.
Saludos. |
| | Volver arriba | |  | brito87
Registrado: 04 Nov 2007 Mensajes: 14
| Publicado: 23/11/2007 12:10 am | | | Título: |
| Muxas gracias por la ayuda, y lo que me dices en ultimo lugar como seria??? Otra duda que tengo es que si yo pido por teclado la fecha en formato "%d-%m-%Y" y lo guardo, como podria incremetarla??? y obtener el dia de mañana, pasado y anterior???? Ya que tambien en el programita que estoi implementando me gustaria que diera esa opcion aparte de la del sistema.
| Código: | char fecha[20]; printf("\nIntroduzca la fecha del cumpleaño en el formato dd-mm-yyy: "); gets(fecha); fflush(stdin); ............................ |
Espero que me puedas echar otra mano, y muchas gracias por la otra función.  |
| | Volver arriba | |  | | mamntc02
Registrado: 30 Abr 2007 Mensajes: 277
| Publicado: 23/11/2007 1:14 am | | | Título: |
| Hola,
la estructura tm, es la q tu declaras para stmf, esta estructura, q la puedes ver en <time.h>, tiene una serie de campos para insertar la hora y la fecha. Una vez llenados los campos requeridos, puedes usar mktime(), para convertir tu estructura tm, en un valor del tipo time_t, q está en segundos. A partir de ahí, sólo tienes q sumar o restar segundos. Y luego volver a recuperar tu estructura tm, con gmtime() ó localtime.
Saludos. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3837 Ubicación: Mexico
| Publicado: 24/11/2007 6:48 am | | | Título: |
| Un problema con el incremento directo de una variable de tipo time_t es que si bien usualmente este tipo es un tipo entero y usualmente representa el numero de segundos transcurridos desde una fecha dada (epoch?) el estandar de C solo garantiza que este sea un tipo aritmetico (entero o punto flotante) y de la representacion interna deja todo a la imaginacion (no dice nada).
Si se desea obtener una fecha pasada o futura una posible opcion es obtener esta en una estructura "struct tm" (siguiendo lo ya comentado por mamntc02), sumar/restar el numero segundos/minutos/etc. al campo indicado (tm_sec/tm_min/etc.) y por ultimo reajustar la fecha mediante la funcion mktime.
Al menos en teoria deberia funcionar.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | brito87
Registrado: 04 Nov 2007 Mensajes: 14
| Publicado: 26/11/2007 12:25 am | | | Título: |
| Muchas gracias por la ayuda aportada, lo voi a intentar, a ver que sale, espero solucionarlo por mi solo, sino ya posteo aqui y aver si me podeis echar otra mano. . Lo suyo habia sido darmelo echo, pero asi no se aprende, lo mejor es ponerse a programar por uno mismo.
Otra preguntilla que tenia y haber si me la podeis responder. Cuando programaba en windows y quería hacer esto:
char tab[5], tab2[5]; tab[5]=tab2[5];
lo que hacía era meter parte de la cadena tab2 en tab, para que me metiera solo esa posición declaraba la cadena como static y todo solucionado. Sin embargo ahora estoy programando en c (linux) y aún declarando la cadena como static no logró que me meta solo esa posición, mete toda la cadena o parte de ella, si mepodeis echar un cable les estaría agradecido. salu2 y gracias por adelantado |
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 3837 Ubicación: Mexico
| Publicado: 26/11/2007 8:36 am | | | Título: |
| Hay dos errores con ese fragmento de codigo.
El primero es, cuando se declara un array, se indica el numero de elementos "N" y despues se accede a estos mediante los indices 0 ... N-1, utilizar como indice "N" no es valido porque no forma parte del array (pero si puede utilizarse en aritmetica de punteros).
El otro error es, en el caso de los arrays, no puedes utilizar el operador de asignacion para copiar una parte de un array a otro, solo elementos individuales. Para copiar arrays (o parte de estos) se pueden utilizar las funciones strcpy/strncpy (si se trata de cadenas) o (en el caso general) memcpy/memmove.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | brito87
Registrado: 04 Nov 2007 Mensajes: 14
| Publicado: 26/11/2007 9:46 am | | | Título: |
| Muxas gracias de todas maneras, pero lo que hacia era esto: char tab[5]; cahr bat[5];
tab[0]=bat[3]; tab[1]=bat[4];
El problema radicaba en que windows es windows, y si tu no asigna nada a una cadena, tabla, o lo que sea el compilador, lo declara automaticamente a NULL, pero en linux el contro es mas exautivo, y al no iniciarlizarlo a nada, puedo contener cuaquir cosa de algun otro elemento, que era lo que me pasaba e imprimia caracteres raros, al inicielizarlo a NULL, se acaba el prblema. Muchas gracias de todas formas. |
| | Volver arriba | |  | brito87
Registrado: 04 Nov 2007 Mensajes: 14
| Publicado: 26/11/2007 4:40 pm | | | Título: |
| Hola de nuevo, volviendo al post anterior de la hora, la maravillosa teoria nos muestra que no tenemos ningun tipo de problemas a utlizar los campo de la funcion tem, los cuales son los siguientes:
| Código: | struct tm { int tm_sec; // Segundos int tm_min; // Minutos int tm_hour; // Horas (0--23) int tm_mday; // Dia del mes (1--31) int tm_mon; // Número del mes (0--11) int tm_year; // Año (año de calendario menos 1900) int tm_wday; // Dia de semana (0--6; Domingo = 0) int tm_yday; // Dia del año (0--365) int tm_isdst; // Diferencia de hora por adelanto de verano };
|
Pero llevo ya 3 dias comiendome la cabeza, y no consigo dar con la solución, llevo como unos 15 codigos realizados, desde pequeños hasta alguno gigantesco, tanto leidos(30) y entrado en numerosas web, pero en ninguno e logrado sacar la solucion, e aprendido incluso cosa de puntero y recursividad jeje . Asi que aqui os dejo el codigo que mas se aprocima a lo que quiro conseguir, el cual esta mal por supuesto, pero la estructura creo que es la correcta.
1. metos los datos en la structura stmp 2. la paso al tipo tem esos datos 3 lo sumo los segondos 4 intento obtener los cambios de la suma 5 imprimo las modificaciones
| Código: | #include <stdio.h> #include <time.h>
int main() {
int dia=1; int mes=5; time_t t; t = time(NULL); struct tm *stmf;
stmf->tm_mday = dia; stmf->tm_mon = mes; time_t mktime(struct tm* stmf ); stmf->tm_sec+= 86400;
dia= gmtime( &stmf->tm_mday ); mes= gmtime( &stmf->tm_mon );
printf("El dia es: %d", dia); printf("El dia es: %d", mes);
getchar(); return 0; }
|
Espero que me echeis una mano, muchas gracias por anticipado, la ayuda me esta siendo de gran ayuda para aprender C y obtener un código bastante currado, el cual colgare nadamas lo termine.  |
| | Volver arriba | |  | | mamntc02
Registrado: 30 Abr 2007 Mensajes: 277
| Publicado: 27/11/2007 1:40 am | | | Título: |
| Hola,
Los errores q te marca el compilador te deberían dar una indicación. He tomado tú código y le he pasado el compilador gcc de MinGW: 3.4.2. Y los errores:| g++ -o prueba.exe prueba.cpp escribió: | prueba.cpp:18: error: invalid conversion from `int*' to `const time_t*' prueba.cpp:18: error: initializing argument 1 of `tm* gmtime(const time_t*)' prueba.cpp:18: error: invalid conversion from `tm*' to `int' prueba.cpp:19: error: invalid conversion from `int*' to `const time_t*' prueba.cpp:19: error: initializing argument 1 of `tm* gmtime(const time_t*)' prueba.cpp:19: error: invalid conversion from `tm*' |
Y esto es por un mal uso de gmtime(). La verdad es q no sé qué prentendes hacer usando esta función, pero está mal hecho. Su prototipo es:| Cita: | #include <time.h> struct tm *gmtime( const time_t *time ); |
Tu uso de mktime() tampoco lo entiendo. No querrías hacer algo como?| Código: | t = mktime(stmf); t+=86400; struct tm* newDate = gmtime(t); printf("El dia es: %d", newDate->tm_mday); printf("El mes es: %d", newDate->tm_mon+1); |
Saludos. |
| | Volver arriba | |  | brito87
Registrado: 04 Nov 2007 Mensajes: 14
| Publicado: 27/11/2007 2:22 am | | | Título: |
| Muchas gracias es mas o menos lo que busco, pero expero explicartelo mejor ahora:
1. Mi primera opcion es que el usuario meta un dia y un mes int dia,mes;
2. Una vez obtenido esto mediante scanf, modificar los campos stmf->tm_mday = dia; stmf->tm_mon = mes;
para meter en la estructura tm los datos introducidos por el usuario
3. Acontinuación sumarle los segundos pertinentes t+=86400;
4. Recuperar los campos modificados y meterlos en mis variables dia=stmf->tm_mday ; mes=stmf->tm_mon;
5. Y por último imprimir esas variables. printf("El dia es: %d",dia); printf("El mes es: %d", mes);
Espero que ahora quedo totalmente aclarado lo que estoi intentando hacer y que me esta dando tantos dolores de cabeza, (eso solo es guion de pauta, del resultado que quiero llegar a conseguir). Y una cosa mas e probado lo que me diste ariba, me falla y no se porque:
struct tm* newDate = gmtime(t);
21 C:\Documents and Settings\Administrador\Escritorio\trabajo pro\tiempofinal.cpp invalid conversion from `time_t' to `const time_t*' 21 C:\Documents and Settings\Administrador\Escritorio\trabajo pro\tiempofinal.cpp initializing argument 1 of `tm* gmtime(const time_t*)'
Muchas gracias por toda la ayuda que me esta siendo dada, y espero que siga . 1 Cordial saludo |
| | Volver arriba | |  | mamntc02
Registrado: 30 Abr 2007 Mensajes: 277
| Publicado: 27/11/2007 5:18 am | | | Título: |
| Perdón me equivouqué , pero como te dice el error, no puede convertir un tipo de dato a un puntero. A gmtime() debes pasarle un puntero, por tanto falta el operador &:| Código: | struct tm* newDate = gmtime(&t); |
De todas formas, es posible (no lo he probado) q te de error al hacer eso, pq la estructura tm necesita más datos para poderla convertir a tipo 'time_t', entro ellos, el año, horas, minutos y segundos.... Debes, al menos, inicializarlos. Como consejo, todos sabemos q muchos de los mensajes de error son muy crípticos, pero tarde o temprano hay q empezar a enfrentarse a ellos. El q te ha aparecido es bastante claro (con un mínimo de experiencia, claro), ya q te dice q hay un tipo de dato q no concuerda. Lo único q debes hacer en un caso así, es ver cual es prototipo de la función, y ver si tus parámetros cumplen ese prototipo. En otros mensajes puede ser mucho más complicado (o más facil), pero tarde o temprano debes ponerte. Así aprenderás más, y pondrás menos posts (hehehehehe)
Saludos. |
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 3837 Ubicación: Mexico
| Publicado: 27/11/2007 10:16 am | | | Título: |
| Para ajustar una fecha incrementando/decrementando esta en un numero dado de dias/minutos/etc. puedes utilizar directamente la estructura de tipo "struct tm", solo tienes que utilizar (despues del incremento/decremento) la funcion mktime para que esta reajuste los valores dentro de su rango valido.
Un ejemplo en C estandar es:
| Código: | #include <stdio.h> #include <stdlib.h> #include <time.h>
#define LONG_MAX_CADENA 256
int main(void) { time_t t_fecha_actual; struct tm tm_fecha_actual; int diff; char cadena[LONG_MAX_CADENA]; if (time(&t_fecha_actual) == (time_t) -1) return EXIT_FAILURE; tm_fecha_actual = *localtime(&t_fecha_actual); printf("Introduce la diferencia en dias: "); fflush(stdout); if (scanf("%d", &diff) != 1) return EXIT_FAILURE; strftime( cadena, LONG_MAX_CADENA, "Fecha actual: %Y/%m/%d\n", &tm_fecha_actual ); printf("%s\n", cadena); tm_fecha_actual.tm_mday += diff; mktime(&tm_fecha_actual); printf("Fecha actual + (%d) dias: ", diff); strftime( cadena, LONG_MAX_CADENA, "%Y/%m/%d\n", &tm_fecha_actual ); printf("%s\n", cadena); return EXIT_SUCCESS; } |
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |