PDA

Ver la Versión Completa : Problema con datetime


MacStreet
20-10-2017, 00:00:58
Hola a toda la comunidad de clubdelphi, tengo un problema al usar el datetime, anteriormente usaba este codigo : procedure TForm1.FormCreate(Sender: TObject);
var
fin:boolean;
a:TDateTime;
f : TextFile;
begin

a:=DateToStr('10/09/2017');
// fechaes:'dia/mes/año'
if date >= a then
begin
fin:=true;
Application.Terminate();
end;
end;

funciona perfectamente y todo, el problema viene a ser cuando tu cambias la fecha de tu ordenador la cambias al dia : "10/09/2017"
vuelve a funcionar la aplicacion, asi ya se haya vencido, estube pensando en que ya no usara la fecha por defecto del ordenador si no que usé la fecha del internet (obtener hora desde internet ) pero no sabria como cambiar el valor por defecto que tiene el datetime, estube viendo y me dijieron que use el "IdSNTP1" .
Gracias por adelantado :D

identsoft
20-10-2017, 10:37:12
Has probado a cambiar el oredn de la fecha:
a:=DateToStr('2017/09/10') ?

identsoft
20-10-2017, 10:38:59
perdón.
a:=strtodate('2017/09/10')

Guti13
20-10-2017, 11:28:34
Yo personalmente te recomendaría usar CompareDate combinado con EncodeDate, algo así


If CompareStr(Today, EncodeDate(2017,9,10)=LessThanValue Then
Begin
......
End

ecfisa
20-10-2017, 16:08:22
Hola.
...
funciona perfectamente y todo, el problema viene a ser cuando tu cambias la fecha de tu ordenador la cambias al dia : "10/09/2017"
vuelve a funcionar la aplicacion, asi ya se haya vencido, estube pensando en que ya no usara la fecha por defecto del ordenador si no que usé la fecha del internet (obtener hora desde internet ) pero no sabria como cambiar el valor por defecto que tiene el datetime, estube viendo y me dijieron que use el "IdSNTP1" .
...


...
implementation

uses IdSNTP;

function iNetDateTime(const aHost: string) : TDateTime;
var
idSNTP: TIdSNTP;
begin
idSNTP:= TIdSNTP.Create(nil);
try
idSNTP.Host := aHost;
Result := idSNTP.DateTime;
finally
idSNTP.Free;
end;
end;
...


Ejemplo de uso:

procedure TForm1.Button1Click(Sender: TObject);
var
dt: TDateTime;
begin
try
dt := iNetDateTime('time.windows.com');
ShowMessage( DateToStr(dt) );
except // manejar el problema...
ShowMessage('Error obteniendo la fecha');
end;
end;


En el siguiente enlace tenes una lista con servidores horarios: Servidores NTP (http://www.pool.ntp.org/es/)

Saludos :)

MacStreet
20-10-2017, 19:10:10
Hola.



...
implementation

uses IdSNTP;

function iNetDateTime(const aHost: string) : TDateTime;
var
idSNTP: TIdSNTP;
begin
idSNTP:= TIdSNTP.Create(nil);
try
idSNTP.Host := aHost;
Result := idSNTP.DateTime;
finally
idSNTP.Free;
end;
end;
...


Ejemplo de uso:

procedure TForm1.Button1Click(Sender: TObject);
var
dt: TDateTime;
begin
try
dt := iNetDateTime('time.windows.com');
ShowMessage( DateToStr(dt) );
except // manejar el problema...
ShowMessage('Error obteniendo la fecha');
end;
end;



Saludos :)

Lo probaré ,muchas gracias por la ayuda!

MacStreet
20-10-2017, 19:14:15
perdón.
a:=strtodate('2017/09/10')

Si, pero como dijé :
mi aplicacion funcionara solo hasta el dia : 10/09/2017 luego de esa fecha se cierra automaticamente.
pero si cambio la fecha del ordenador, puedo volver a usar la aplicacion por eso que queria ya no usar ese metodo, si no otro y no sabria como crear otro metodo :(

MacStreet
22-10-2017, 00:45:52
Hola.



...
implementation

uses IdSNTP;

function iNetDateTime(const aHost: string) : TDateTime;
var
idSNTP: TIdSNTP;
begin
idSNTP:= TIdSNTP.Create(nil);
try
idSNTP.Host := aHost;
Result := idSNTP.DateTime;
finally
idSNTP.Free;
end;
end;
...


Ejemplo de uso:

procedure TForm1.Button1Click(Sender: TObject);
var
dt: TDateTime;
begin
try
dt := iNetDateTime('time.windows.com');
ShowMessage( DateToStr(dt) );
except // manejar el problema...
ShowMessage('Error obteniendo la fecha');
end;
end;


En el siguiente enlace tenes una lista con servidores horarios:

Saludos :)
No me funciona :( osea si obtiene la fecha y todo, pero lo que yo quiero hacer es que mi aplicacion al detectar el dia "10/09/2017" se cierre .
espero que me entiendas :/

Casimiro Notevi
22-10-2017, 16:28:44
espero que me entiendas :/
http://www.clubdelphi.com/foros/guiaestilo.php

mamcx
22-10-2017, 21:40:17
Esa fecha la pones TU o el USUARIO?

Porque si la pones TU, estas auto-infligiendote el problema. Es muy simple: Utiliza formatos no ambiguos, y se EXPLICITO en como serializas y deserializas la informacion.

En el caso de las fechas, se usa el formato ISO (https://es.wikipedia.org/wiki/ISO_8601). Y cuando lees DEBES ESPECIFICAR EN QUE FORMATO!

Tipo:


LeerFecha('2001-01-01T01:05:01', FormatoISO)

ecfisa
23-10-2017, 18:40:33
Hola.
No me funciona :( osea si obtiene la fecha y todo, pero lo que yo quiero hacer es que mi aplicacion al detectar el dia "10/09/2017" se cierre .
espero que me entiendas :/
Ah, pero yo había entendido que el problema era que no querías tomar la hora del sistema por que la podian cambiar y no que ignorabas como comparar las dos fechas.

En ese caso:

uses IdSNTP;

function ExpiredDate(const vto: TDateTime; const aHost: string): Boolean;
var
idSNTP: TIdSNTP;
dt: TDateTime;
begin
idSNTP:= TIdSNTP.Create(nil);
try
idSNTP.Host := aHost;
dt := idSNTP.DateTime;
finally
idSNTP.Free;
end;
Result := dt >= vto;
end;


Ejemplo de uso:

...
begin
if ExpiredDate( StrToDate('10/09/2017'), 'time.windows.com' ) then
Application.Terminate
else
ShowMessage('Todo ok');
...


Saludos :)