Ao desenvolver aplicativos, muitas vezes é necessário obter a hora atual do sistema. Embora o Y2K pareça ter ficado para trás, ainda precisamos ter cuidado sobre como lidamos com o tempo em nossos aplicativos recém-desenvolvidos.
A página 89 de "Integração - Delphi 4.0 Practical Skills" (doravante denominado "o livro") apresenta especificamente dois métodos para obter a hora atual do sistema, mas ambos os métodos apresentam deficiências ou erros, que serão discutidos a seguir.
O primeiro método neste livro é usar a função Time() para obter a hora atual do sistema, e o resultado de retorno é uma variável do tipo de estrutura TDateTime. Por exemplo:
Procedimento TForm1.Button2Click(Remetente: TObject);
var
DataHora:TDateTime;
começar
DataHora:=Hora();
Legenda:=DateToStr(DateTime)+' '+TimeToStr(DateTime);
fim;
Mas não importa qual seja a data, o resultado é 99-12-30 xx:xx:xx Obviamente a data está errada. Analisando a ajuda do Delphi, Time() é usado para retornar o "tempo - horas, minutos e segundos" correto, ou seja, TimeToStr (DateTime), e não deve ser usado para retornar "data". Na verdade, a única função do sistema usada para retornar datas é Date.
Então, o que pode retornar a “hora, minuto, segundo” correto e o “ano, mês, dia” correto? Você pode usar a função Now, por exemplo:
procedimento TForm1.Button1Click(Remetente: TObject);
var
meutempo: TDateTime;
começar
meutempo:=Agora;
Legenda:=DateToStr(minhahora)+' '+TimeToStr(minhahora);
//Ou use Caption diretamente := DateTimeToStr(Now);
fim;
O formato de data retornado por Now possui apenas 2 dígitos para o ano, ou seja, o ano 2000 é exibido como 00, o que parece insatisfatório. Além disso, tanto Now quanto Time só podem obter o tempo com precisão de segundos. tempo preciso no nível de milissegundos. Você pode usar a função API GetSystemTime e seu tipo TSystemTime correspondente é definido como:
TSystemTime = registro
wAno: Palavra;
wMês: Palavra;
wDayOfWeek: Palavra;
wDia: Palavra;
quemHora: Palavra;
wMinuto: Palavra;
wSegundo: Palavra;
wMilissegundos: Palavra;
fim;
Obviamente, sua estrutura também pode ser convenientemente usada na lógica do programa para formar vários valores de tempo, portanto, usar a função GetSystemTime traz grandes vantagens. Porém, o uso desta função no livro está errado. Consultando a ajuda do Windows SDK, podemos ver que o protótipo desta função é:
VOID GetSystemTime(LPSYSTEMTIME lpst), o ponteiro do parâmetro lpst obtém a hora do sistema, portanto pode ser implementado como o seguinte segmento de programa:
procedimento TForm1.Button3Click(Remetente: TObject);
var
SysTime: TsystemTime;
começar
GetSystemTime(SysTime);
Legenda:=IntToStr(SysTime.wYear)+' '+IntToStr(SysTime.wMonth);
//se SysTime.wYear>2000 então
//...Utiliza os diversos valores de tempo obtidos na lógica do programa
fim;
Com base na discussão acima, é mais conveniente e flexível obter a hora atual do sistema usando a função GetSystemTime.