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 03-03-2012
Leviatan Leviatan is offline
Miembro
 
Registrado: oct 2005
Posts: 56
Poder: 19
Leviatan Va por buen camino
Devolver los formatos de fecha de Windows

Hola amigos del foro:

Utilizo Delphi 2010 y quisiera saber si hay alguna función o algo parecido que devuelva los formatos de fecha posibles de Windows, es decir, en mi caso por ejemplo tengo Windows 7 y al configurar el formato de fecha en "Configuración regional y de idioma" para la "Fecha corta" el ComboBox me muestra las siguientes alternativas: dd/MM/aaaa, dd/MM/aa, d/M/aa, dd-MM-aa, aaaa-MM-dd.

¿Es posible devolver estos cinco formatos?

Saludos.
Responder Con Cita
  #2  
Antiguo 03-03-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que no se entiende exactamente qué quieres hacer o qué problema tienes.
Tú puedes usar el formato que quieras, qué quieres decir con "¿Es posible devolver estos cinco formatos?"
Responder Con Cita
  #3  
Antiguo 03-03-2012
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Aunque no lo veo muy clara la pregunta, entiendo que si utilizas las propiedades que te brinde la máscara del componente que utilices lograrás lo que quieres y sinó utiliza al función FormatDateTime.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #4  
Antiguo 04-03-2012
Leviatan Leviatan is offline
Miembro
 
Registrado: oct 2005
Posts: 56
Poder: 19
Leviatan Va por buen camino
En primer lugar gracias por sus comentarios.

A ver si me explico.

Estoy desarrollando una aplicación que, entre otras cosas, lee datos separados por "pipes" en un socket TCP. Entre esos datos me viene la fecha y la hora en esta forma: ...|...|20120117074642|...|... (sería añomesdiahoraminutosegundo).

Lo primero que hago es descomponer la fecha/hora en sus partes, o sea:

Código Delphi [-]
function FormatearFechaHora(Cadena: string): string;
var
  Anio, Mes, Dia, Hora, Min, Seg: string;
  FechaHora: TDateTime;
  ...
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);
  ...
  ...
  // Lo convierto a formato FechaHora
  FechaHora := StrToDateTime(Dia + '/' + Mes + '/' + Anio + ' ' + Hora + ':' + Min + ':' + Seg);
  ...
  ...
  // Luego devuelvo el valor en otro formato
  Result := AnsiReplaceStr(FormatDateTime('yyyy-mm-dd hh:mm:ss', FechaHora), ' ', 'T');
end;

Ahora, el meollo de la cuestión está en esta sentencia:

Código Delphi [-]
begin
  ...
  FechaHora := StrtoDateTime(Dia + '/' + Mes + '/' + Anio + ' ' + Hora + ':' + Min + ':' + Seg);"
  ...
end;
Para un equipo en el que está configurado el formato "dd/mm/yyyy" funciona de maravilla, pero cuando ejecuto la aplicación en un equipo con formato "mm/dd/yyyy", me dice que la fecha "17/01/2012 07:46:42" no es una fecha/hora válida, claro, no existe el mes "17". Luego probé colocando primero el mes y luego el día obteniendo el efecto contrario, es decir, funciona con el formato "mm/dd/yyyy" pero error en formato "dd/mm/yyyy".

La idea es que la aplicación se ajuste al formato de fecha establecido en la Configuración regional y no al revés.

Entonces, la única alternativa que se me ocurrió es poder "leer" todos los formatos de fecha que el SO me permite elegir y comparar con lo que está realmente establecido.

En mi mensaje anterior les decía por ejemplo que dos de los formatos eran "dd/MM/yyyy" y "dd/MM/yy", los cuales obviamente para Delphi son diferentes. Por eso es que preguntaba si se podía devolver "esos cinco formatos" que es mi caso, compararlos con lo que se definió efectivamente en la Configuración regional y en base a eso decirle a la aplicación que la fecha será "Dia + '/' + Mes + '/' + Anio" o "Mes + '/' + Dia + '/' + Anio" o algún otro.

Quizás ustedes tengan alguna alternativa mejor a lo que yo estoy planteando.

Bueno, espero ahora sí haber sido claro.

Saludos.

Última edición por Leviatan fecha: 04-03-2012 a las 05:12:13.
Responder Con Cita
  #5  
Antiguo 04-03-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Para un equipo en el que está configurado el formato "dd/mm/yyyy" funciona de maravilla, pero cuando ejecuto la aplicación en un equipo con formato "mm/dd/yyyy", me dice que la fecha "17/01/2012 07:46:42" no es una fecha/hora válida, claro, no existe el mes "17".
Hola Leviatan.

Podrías evaluar previamente la configuración actual para luego hacer la conversión correspondiente:
Código Delphi [-]
function FormatearFechaHora(Cadena: string): string;
var
  Anio, Mes, Dia, Hora, Min, Seg: string;
  FechaHora: TDateTime;
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);
  if UpperCase(Copy(ShortDateFormat,1,2)) = 'DD' then
    FechaHora := StrToDateTime(Dia + '/' + Mes + '/' + Anio + ' ' + Hora + ':' + Min + ':' + Seg)
  else
    FechaHora := StrToDateTime(Mes + '/' + Dia + '/' + Anio + ' ' + Hora + ':' + Min + ':' + Seg);
  Result := AnsiReplaceStr(FormatDateTime('yyyy-mm-dd hh:mm:ss', FechaHora), ' ', 'T')
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
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
  #7  
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
  #8  
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
  #9  
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
  #10  
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
  #11  
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 15:10:32.


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