Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-03-2012
Leviatan Leviatan is offline
Miembro
 
Registrado: oct 2005
Posts: 56
Poder: 19
Leviatan Va por buen camino
Gracias ecfisa.

Lo resolví de una manera similar a lo que me estás comentando:

Código Delphi [-]
function FormatearFechaHora(Cadena: string): string;
var
  Anio, Mes, Dia, Hora, Min, Seg, sFecha: string;
  FechaHora: TDateTime;
  iDia, iMes, iAnio: Integer;
begin
  Anio := Copy(Cadena, 1, 4);
  Mes := Copy(Cadena, 5, 2);
  Dia := Copy(Cadena, 7, 2);
  Hora := Copy(Cadena, 9, 2);
  Min := Copy(Cadena, 11, 2);
  Seg := Copy(Cadena, 13, 2);

  // Deducir el formato de la fecha
  iDia := Pos('d', SysUtils.ShortDateFormat);
  if iDia = 0 then
    iDia := Pos('D', SysUtils.ShortDateFormat);

  iMes := Pos('m', SysUtils.ShortDateFormat);
  if iMes = 0 then
    iMes := Pos('M', SysUtils.ShortDateFormat);

  iAnio := Pos('y', SysUtils.ShortDateFormat);
  if iAnio = 0 then
    iAnio := Pos('Y', SysUtils.ShortDateFormat);

  if (iDia < iMes) and (iDia < iAnio) and (iMes < iAnio) then
  begin
    if Pos('/', SysUtils.ShortDateFormat) > 0 then
      sFecha := Dia + '/' + Mes + '/' + Anio + ' ' + Hora + ':' + Min + ':' + Seg
    else
    if Pos('-', SysUtils.ShortDateFormat) > 0 then
      sFecha := Dia + '-' + Mes + '-' + Anio + ' ' + Hora + ':' + Min + ':' + Seg
  end
  else
  if (iMes < iDia) and (iMes < iAnio) and (iDia < iAnio) then
  begin
    if Pos('/', SysUtils.ShortDateFormat) > 0 then
      sFecha := Mes + '/' + Dia + '/' + Anio + ' ' + Hora + ':' + Min + ':' + Seg
    else
    if Pos('-', SysUtils.ShortDateFormat) > 0 then
      sFecha := Mes + '-' + Dia + '-' + Anio + ' ' + Hora + ':' + Min + ':' + Seg
  end
  else
  if (iAnio < iDia) and (iAnio < iMes) and (iMes < iDia) then
  begin
    if Pos('/', SysUtils.ShortDateFormat) > 0 then
      sFecha := Anio + '/' + Mes + '/' + Dia + ' ' + Hora + ':' + Min + ':' + Seg
    else
    if Pos('-', SysUtils.ShortDateFormat) > 0 then
      sFecha := Anio + '-' + Mes + '-' + Dia + ' ' + Hora + ':' + Min + ':' + Seg;
  end;

  FechaHora := StrToDateTime(sFecha);

  Result := AnsiReplaceStr(FormatDateTime('yyyy-mm-dd hh:mm:ss', FechaHora), ' ', 'T');
end;

Inclusive tengo que decirle a la aplicación si los separadores serán barras o guiones, porque aún en esto me daba error de formato.

Gracias y saludos.

Última edición por Leviatan fecha: 04-03-2012 a las 17:44:20.
Responder Con Cita
  #2  
Antiguo 05-03-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hola,

Creo que te estás complicando innecesariamente. Si ya tienes separados los valores de añom mes, dia, etc. ¿por qué no simplemente los concatenas en el formato que deseas?

Código Delphi [-]
function FormatearFechaHora(Cadena: String): String;
var
  Anio, Mes, Dia, Hora, Min, Seg: String;

begin
  Anio := Copy(Cadena, 1, 4);
  Mes := Copy(Cadena, 5, 2);
  Dia := Copy(Cadena, 7, 2);
  Hora := Copy(Cadena, 9, 2);
  Min := Copy(Cadena, 11, 2);
  Seg := Copy(Cadena, 13, 2);

  Result := Format('%s-%s-%sT%s:%s:%s', [Anio, Mes, Dia, Hora, Min, Seg]);
end;

// Saludos
Responder Con Cita
  #3  
Antiguo 05-03-2012
Leviatan Leviatan is offline
Miembro
 
Registrado: oct 2005
Posts: 56
Poder: 19
Leviatan Va por buen camino
Hola roman; gracias por responder.

Lo que pasa es que yo en realidad no mostré todo el código de la función. Aparte de convertir al formato que devuelve la función, antes de eso tengo que hacer una operación con la fecha: sumar o restar horas según la zona horaria del equipo (-UTC o +UTC) en el cual esté instalada la app. Por eso solo mostré la parte que a mí me interesaba la cual era poder determinar el formato de la fecha.

Este es el código definitivo:

Código Delphi [-]
function FormatearFechaHora(Cadena: string): string;
var
  Anio, Mes, Dia, Hora, Min, Seg, sFecha: string;
  Info: TIME_ZONE_INFORMATION;
  FechaHora, Bias: TDateTime;
  iDia, iMes, iAnio: Integer;
begin
  Anio := Copy(Cadena, 1, 4);
  Mes := Copy(Cadena, 5, 2);
  Dia := Copy(Cadena, 7, 2);
  Hora := Copy(Cadena, 9, 2);
  Min := Copy(Cadena, 11, 2);
  Seg := Copy(Cadena, 13, 2);

  GetTimeZoneInformation(Info);
  Bias:= abs(Info.Bias + Info.DaylightBias) / 1440;

  // Deducir el formato de la fecha
  iDia := Pos('d', SysUtils.ShortDateFormat);
  if iDia = 0 then
    iDia := Pos('D', SysUtils.ShortDateFormat);

  iMes := Pos('m', SysUtils.ShortDateFormat);
  if iMes = 0 then
    iMes := Pos('M', SysUtils.ShortDateFormat);

  iAnio := Pos('y', SysUtils.ShortDateFormat);
  if iAnio = 0 then
    iAnio := Pos('Y', SysUtils.ShortDateFormat);

  if (iDia < iMes) and (iDia < iAnio) and (iMes < iAnio) then
  begin
    if Pos('/', SysUtils.ShortDateFormat) > 0 then
      sFecha := Dia + '/' + Mes + '/' + Anio + ' ' + Hora + ':' + Min + ':' + Seg
    else
    if Pos('-', SysUtils.ShortDateFormat) > 0 then
      sFecha := Dia + '-' + Mes + '-' + Anio + ' ' + Hora + ':' + Min + ':' + Seg
  end
  else
  if (iMes < iDia) and (iMes < iAnio) and (iDia < iAnio) then
  begin
    if Pos('/', SysUtils.ShortDateFormat) > 0 then
      sFecha := Mes + '/' + Dia + '/' + Anio + ' ' + Hora + ':' + Min + ':' + Seg
    else
    if Pos('-', SysUtils.ShortDateFormat) > 0 then
      sFecha := Mes + '-' + Dia + '-' + Anio + ' ' + Hora + ':' + Min + ':' + Seg
  end
  else
  if (iAnio < iDia) and (iAnio < iMes) and (iMes < iDia) then
  begin
    if Pos('/', SysUtils.ShortDateFormat) > 0 then
      sFecha := Anio + '/' + Mes + '/' + Dia + ' ' + Hora + ':' + Min + ':' + Seg
    else
    if Pos('-', SysUtils.ShortDateFormat) > 0 then
      sFecha := Anio + '-' + Mes + '-' + Dia + ' ' + Hora + ':' + Min + ':' + Seg;
  end;

  FechaHora := StrToDateTime(sFecha);

  // Aquí sumo o resto las horas de diferencia según la zona horaria del equipo sea -UTC o +UTC
  if Info.Bias + Info.DaylightBias < 0 then
    FechaHora := FechaHora - StrToTime(TimeToStr(Bias))
  else
    FechaHora := FechaHora + StrToTime(TimeToStr(Bias));

  Result := AnsiReplaceStr(FormatDateTime('yyyy-mm-dd hh:mm:ss', FechaHora), ' ', 'T');
end;

Fue también responsabilidad mía no incluir todo el código a fin de evitar confusiones.

Un abrazo.
Responder Con Cita
  #4  
Antiguo 05-03-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
En ese caso, puedes hacer algo como esto:

Código Delphi [-]
function FormatearFechaHora(Cadena: String): String;
var
  Y, M, D, H, N, S: Integer;
  DT: TDateTime;

begin
  Y := StrToInt(Copy(Cadena, 1, 4));
  M := StrToInt(Copy(Cadena, 5, 2));
  D := StrToInt(Copy(Cadena, 7, 2));
  H := StrToInt(Copy(Cadena, 9, 2));
  N := StrToInt(Copy(Cadena, 11, 2));
  S := StrToInt(Copy(Cadena, 13, 2));

  DT := EncodeDateTime(Y, M, D, H, N, S, 0);

  {
    Operaciones con DT
  }

  // Observa el uso de las dobles comillas para la T
  Result := FormatDateTime('yyyy-mm-dd"T"hh:mm:ss', DT);
end;

// Saludos
Responder Con Cita
  #5  
Antiguo 05-03-2012
Leviatan Leviatan is offline
Miembro
 
Registrado: oct 2005
Posts: 56
Poder: 19
Leviatan Va por buen camino
Gracias.

Justamente por eso quería saber si había una alternativa mejor de solución, ya que la mía me parece un poco rebuscada. La tuya me parece una solución elegante.

La pruebo y te cuento que tal me fue.

Saludos.
Responder Con Cita
  #6  
Antiguo 06-03-2012
Leviatan Leviatan is offline
Miembro
 
Registrado: oct 2005
Posts: 56
Poder: 19
Leviatan Va por buen camino
Gracias roman.

Me ha funcionado correctamente. Ahora mi código es más simple, claro y manejable.

Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con formatos de idioma Windows 7 SAGOAN Varios 6 04-07-2011 10:37:28
Consulta con formatos de fecha pau_elx SQL 4 26-05-2011 08:13:37
convertir formatos fecha davidgaldo Varios 4 09-11-2005 15:49:35
Fecha de Windows sebas API de Windows 1 08-07-2003 18:42:20
Bloquear Fecha en Windows Gabriel A Reyes API de Windows 9 04-07-2003 14:11:14


La franja horaria es GMT +2. Ahora son las 08:47:59.


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