PDA

Ver la Versión Completa : Convertir fecha con formato sql a algo legible


Delphitest
18-04-2007, 12:38:28
Buenos días a tod@s,

hacía mucho que no pasaba por el foro. He tenido que dejar de lado el programa que empece con tanta ilusión ya que me resulta imposible sacar tiempo para ello, a ver si en verano puedo reanudar el asunto.

Me surge una duda:

Trasteo con un foro PHPBB cuyas tablas estan en mysql, y dentro de alguna de ellas hay un campo fecha que está representado en segundos contados desde el 1 de enero de 1980.

Quiero hacer una utilidad sencilla que me convierta ese número en un formato de fecha legible, tipo dd/mm/aaaa hh:mm

Alguien me sabria decir como puedo hacer esta conversión ??

Lo que pretendo es algo muy básico, una casilla edit para insertar el número y una salida tipo label que me de la fecha convertida.

Gracias por vuestra ayuda,

un abrazo

Besto
18-04-2007, 12:54:03
La función que tienes que usar es:

edit.text := DateToStr(UnixToDateTime(tabla.FieldByName('Fecha').value));

Para hacer el proceso contrario, es decir guardar en una tabla la fecha en formato Unix el proceso seria:

tabla.FieldbyName('Fecha').AsInteger := DateTimeToUnix(StrToDate(edit.Text));


Para obtener la fecha correcta desde sql seria:

select from_UnixTime(fecha,"%d/%m/%Y") as fec ...

Delphitest
18-04-2007, 13:31:34
Veo que el foro sigue con la misma eficacia que antes ;) gracias Besto.

Lo de las funciones no acabo de entenderlo pese a mi cabezonería.

El dato que necesito convertir, para simplificarlo, no hace falta sacarlo de la tabla, me basta con escribirlo en un edit a mano. Solo necesito adaptar lo que me dices para que me diga la fecha normal pero no doy con ello.

Os pongo el simple codigo que tengo hasta ahora (es realmente simple como veis):

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Label3: TLabel;
Label4: TLabel;
Button1: TButton;
procedure Edit1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;

implementation
{$R *.dfm}
procedure TForm1.Edit1Change(Sender: TObject);
begin
label4.Caption := 'Aqui la fecha con el formato legible';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
application.Terminate;
end;
end.

Dentro de label4 es donde necesito poner la fecha convertida que introduzco en edit1 (he optado por que ese calculo se haga en cuanto cambie el contenido de edit1 aunque no me importa poner un botón si es mas cómodo)

Besto
18-04-2007, 13:40:17
Si no he entendido mal la fecha en formato numérico la tienes en edit1 y quieres que en label4 aparezca en formato fecha. La funcion que tienes que aplicar sería:

label4.caption := DateToStr(UnixToDateTime(edit1.text));

Delphitest
18-04-2007, 14:18:34
Gracias de nuevo Besto,

eso es lo que quiero hacer, si.

Lo que me indicas es la solución pero me da un error indicando (mas o menos lo entiendo así) que UnixToDateTime no está declarada.

Por eso me referia al tema de las funciones, por si hay que hacer algo mas.

(lo siento, supongo que es una pregunta un poco tonta pero no se que hay que hacer)

Delphitest
18-04-2007, 17:54:03
Lo he medio solucionado dandole vueltas con otra función que he visto buscando en el foro. Os lo pongo por si le sirve a alguien:

procedure TForm1.Edit1Change(Sender: TObject);
var
dias : double;
begin
dias := strtofloat(edit1.text)/86400;
label4.caption := datetostr(EncodeDate(1970,1,1)+dias);
end;


No lo tengo al 100% como yo quería ya que ademas de la fecha quiero que me ponga hh:mm , sigo buscando ... :rolleyes:

Delphitest
18-04-2007, 19:54:06
Bien, pues probando y probando... ya lo tengo

Asi queda el tema, ademas veo que los segundos se inician el 1/1/1970 y no en el 80 como yo pensaba.

procedure TForm1.Edit1Change(Sender: TObject);
var
dias : double;
begin
if edit1.Text <> '' then begin
dias := strtofloat(edit1.text)/86400 + encodedate(1970,1,1);
label4.caption := datetimetostr(dias);
end;
end;


Gracias de todos modos por vuestra colaboración, seguiré molestando de vez en cuando ;)

Besto
19-04-2007, 10:04:38
Aunque ya has encontrado otra solución te indico que para que funcione la función hay que añadir a la clausula lo siguiente:

uses ..., DateUtils

no entendia bien a lo que te referias con el tema de las funciones, perdona.

Delphitest
19-04-2007, 11:48:39
A eso me refería, exacto.

Muchas gracias de todos modos, tomo buena nota para otra vez.

Un abrazo

bitbow
29-05-2007, 04:06:20
Saludos, tambien hace un tiempo he desarrollado un sistema de facturacion, quisiera ver la forma de contactarnos para intercambiar ideas y ver en que podemos colaborar.

Saludos y suerte.