Ver Mensaje Individual
  #8  
Antiguo 05-03-2012
Leviatan Leviatan is offline
Miembro
 
Registrado: oct 2005
Posts: 56
Reputación: 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