Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   conversión fecha de tipo instant (java) a date (delphi) (https://www.clubdelphi.com/foros/showthread.php?t=96800)

Galahad 26-07-2024 14:10:28

conversión fecha de tipo instant (java) a date (delphi)
 
Hola, buenos días.
Estoy descargando de un servicio web un JSON con fechas con este formato:
fechaOperacion":"2024-06-30T22:00:00Z"
el caso es que estaba capturando con funciones de cadena esta fecha y capturandola como 30/06/2024, pero resulta que no,, que la fecha correcta una vez convertida tiene que ser '01/07/2024'

En la documentación de dicho servicio indican que hay que convertirla así.
Código:

import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneId
//Transformamos la cadena obtenida desde el API a un objeto de tipo Instant
Instant instant = Instant.parse('2023-05-09T22:00:00z')
//Si se quiere un dato de tipo Date
Date.from(instant)
//Si se quiere un dato de tipo LocalDateTime
LocalDateTime.ofInstant(instant, ZoneId.of('Europe/Madrid'))
//Si se quiere un dato de tipo LocalDate
instant.atZone(ZoneId.of('Europe/Madrid')).toLocalDate()

He encontrado una manera de poder convertir esa fecha a un tipo de dato datetime de delphi.
he encontrado esta función:

Código Delphi [-]
function JavaToDateTime(Value: Int64): TDateTime;
begin
  Result := UnixToDateTime(Value div 1000);
end;
Mi intención era probarla (no se si funcionará), pero no consigo convertir la cadena : 2024-06-30T22:00:00Z a un valor de tipo Int64 que requiere la función.

¿ Alguien conoce la manera de hacerlo o un camino más directo para dicha conversión ?
Saludos..

cloayza 26-07-2024 16:50:33

Estimado Galahad, le sugiero esta función para convertir la fecha que viene en el JSON...

Código Delphi [-]
uses  System.DateUtils;
{$R *.dfm}

function ConvertDateFromStr(SDate:String):TDateTime;
var
  dt: TDateTime;
begin
     if not TryStrToDateTime(SDate, dt) then
        dt := System.DateUtils.ISO8601ToDate(SDate);

     result := DateOf(dt);
end;

procedure TForm1.btnConvertClick(Sender: TObject);
begin
    //Edit1.Text:='2024-06-30T22:00:00Z';

     DateTimePicker1.DateTime :=ConvertDateFromStr(Edit1.Text);

   //El resultado es 30-06-2024...
end;

Saludos cordiales

Galahad 29-07-2024 08:14:21

Cita:

Empezado por cloayza (Mensaje 556855)
Estimado Galahad, le sugiero esta función para convertir la fecha que viene en el JSON...

Código Delphi [-]
uses  System.DateUtils;
{$R *.dfm}

function ConvertDateFromStr(SDate:String):TDateTime;
var
  dt: TDateTime;
begin
     if not TryStrToDateTime(SDate, dt) then
        dt := System.DateUtils.ISO8601ToDate(SDate);

     result := DateOf(dt);
end;

procedure TForm1.btnConvertClick(Sender: TObject);
begin
    //Edit1.Text:='2024-06-30T22:00:00Z';

     DateTimePicker1.DateTime :=ConvertDateFromStr(Edit1.Text);

   //El resultado es 30-06-2024...
end;

Saludos cordiales

Muchas gracias por contestar.
He probado esa función , con la fecha : 2024-06-30T22:00:00Z , y me devuelve 30/06 no 01/07.
Seguire buscando...

Casimiro Noteví 29-07-2024 11:47:24

¿Y qué esperas que te devuelva?

Galahad 29-07-2024 13:47:19

Cita:

Empezado por Casimiro Notevi (Mensaje 556871)
¿Y qué esperas que te devuelva?

si, tienes razón, la conversión es correcta (30/06)
habiendo investigado algo mas ,creo que el problema es la petición de datos al json, el problema tiene que estar que al pedir los datos al servicio web desde el '01/07' por algún tema de la configuración horaria UTC me está devolviendo también los del 30/06.
sigo buscando..

Casimiro Noteví 29-07-2024 14:07:52

Supongo que te refieres a que si la hora UTC es, por ejemplo, las 22:00:00 y en tu ubicación local tienes 3 horas más, entonces sería la 01:00:00 del día siguiente.
Así que, también supongo, que si en el json viene la hora "real" UTC, tú tendrás que "convertirla" a tu hora local, y el resultado puede se el del ejemplo que he puesto.

Galahad 29-07-2024 16:27:09

Cita:

Empezado por Casimiro Notevi (Mensaje 556873)
Supongo que te refieres a que si la hora UTC es, por ejemplo, las 22:00:00 y en tu ubicación local tienes 3 horas más, entonces sería la 01:00:00 del día siguiente.
Así que, también supongo, que si en el json viene la hora "real" UTC, tú tendrás que "convertirla" a tu hora local, y el resultado puede se el del ejemplo que he puesto.

Hola Casimiro,, efectivamente, ese era el problema...
Al final lo he podido resolver así:

Código Delphi [-]
 
  if not trystrtodatetime( cfecha,dt ) then
      dt := system.dateutils.ISO8601ToDate( cfecha );
   result := TTimeZone.Local.ToLocalTime(dt);

Con esto efectivamente ya aparece la fecha local de esa fecha UTC (01/07)
Muchas gracias por todo,, un abrazo

Casimiro Noteví 29-07-2024 19:19:53

^\||/^\||/^\||/


La franja horaria es GMT +2. Ahora son las 16:24:34.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi