Como saber se a hora do sistema operacional foi alterada?

Preciso implementar um método para saber se a hora do win foi alterada(mais especificamente adiantada).

para datas atrasadas, usei:

if(dataAntiga.after(DataAtual)){

}

Para data do futuro, usei um ponto de referência que é o mesmo minuto + 2. Mas sofro com problemas de sincronização, e algumas vezes o software que estou implementando dispara, que a mesma(data do sistema) foi adiantada.

Alguém poderia me ajudar?

[quote=juliocbq]Preciso implementar um método para saber se a hora do win foi alterada(mais especificamente adiantada).

para datas atrasadas, usei:

if(dataAntiga.after(DataAtual)){

}

Para data do futuro, usei um ponto de referência que é o mesmo minuto + 2. Mas sofro com problemas de sincronização, e algumas vezes o software que estou implementando dispara, que a mesma(data do sistema) foi adiantada.

Alguém poderia me ajudar?[/quote]

Para saber se foi alterada pasta teu procedimento de janela “escutar” por mensagens do tipo WM_TIMECHANGED.

Na verdade o Windows faz um broadcast desta mensagens para todas as janelas, cabe a sua tratá-la.

[quote=boone][quote=juliocbq]Preciso implementar um método para saber se a hora do win foi alterada(mais especificamente adiantada).

para datas atrasadas, usei:

if(dataAntiga.after(DataAtual)){

}

Para data do futuro, usei um ponto de referência que é o mesmo minuto + 2. Mas sofro com problemas de sincronização, e algumas vezes o software que estou implementando dispara, que a mesma(data do sistema) foi adiantada.

Alguém poderia me ajudar?[/quote]

Para saber se foi alterada pasta teu procedimento de janela “escutar” por mensagens do tipo WM_TIMECHANGED.

Na verdade o Windows faz um broadcast desta mensagens para todas as janelas, cabe a sua tratá-la.[/quote]

A sua idéia é muito boa. Mas como consigo dar um hook nesse evento, usando java? Existe um objeto que escuta esse evento?

descobri a jwinapi aqui. Creio que isso pode resolver o meu problema.
Vlw parceiro.

Olhando cuidadosamente o fonte do JDK (as rotinas em C e C++, não em Java), somente achei uma referência a essa mensagem (WM_TIMECHANGE), e era apenas para efetuar um “spy” nas mensagens do Windows no modo de depuração do AWT. Portanto, isso não está “pronto” no JDK e você precisaria de código nativo para poder criar uma janela “escondida” privada de sua aplicação para poder escutar as mensagens WM_TIMECHANGE.

sim, vou precisar de jni. Mas não tem problema. Essa solução resolve o problema da melhor maneira. Os outros algoritmos de pegar a data do futuro não estavam funcionando corretamente.

sim, vou precisar de jni. Mas não tem problema. Essa solução resolve o problema da melhor maneira. Os outros algoritmos de pegar a data do futuro não estavam funcionando corretamente.[/quote]

Usar o util.Timer e o System.currentMillis() não resolve ?
Afinal a memória da ultima hora sempre tem que ser feita pelo programa.

sim, vou precisar de jni. Mas não tem problema. Essa solução resolve o problema da melhor maneira. Os outros algoritmos de pegar a data do futuro não estavam funcionando corretamente.[/quote]

Usar o util.Timer e o System.currentMillis() não resolve ?
Afinal a memória da ultima hora sempre tem que ser feita pelo programa.[/quote]
ae que está o problema. Tenho uma thread que faz isso, mas ela não sincroniza com o win, entende?
é preferível ouvir o sinal wm_timechange.

sim, vou precisar de jni. Mas não tem problema. Essa solução resolve o problema da melhor maneira. Os outros algoritmos de pegar a data do futuro não estavam funcionando corretamente.[/quote]

Usar o util.Timer e o System.currentMillis() não resolve ?
Afinal a memória da ultima hora sempre tem que ser feita pelo programa.[/quote]
ae que está o problema. Tenho uma thread que faz isso, mas ela não sincroniza com o win, entende?
é preferível ouvir o sinal wm_timechange.[/quote]

não, não entendo. Todas as datas e tempos lidos em java advêm de System.currentMillis ou currentNano.
O que é que interessa a hora do SO ?

sim, vou precisar de jni. Mas não tem problema. Essa solução resolve o problema da melhor maneira. Os outros algoritmos de pegar a data do futuro não estavam funcionando corretamente.[/quote]

Usar o util.Timer e o System.currentMillis() não resolve ?
Afinal a memória da ultima hora sempre tem que ser feita pelo programa.[/quote]
ae que está o problema. Tenho uma thread que faz isso, mas ela não sincroniza com o win, entende?
é preferível ouvir o sinal wm_timechange.[/quote]

não, não entendo. Todas as datas e tempos lidos em java advêm de System.currentMillis ou currentNano.
O que é que interessa a hora do SO ?[/quote]

O software que estou trabalhando precisa detectar a mudança da hora e data do sistema, como medida de segurança.
Como posso detectar essa mudança? Detectar atraso eu consigo, mas adiantamento não.

É um sistema do tipo de “missão crítica”? Para mim parece ser um desses, para ser paranóico assim…

Inté.

[quote=KWill]É um sistema do tipo de “missão crítica”? Para mim parece ser um desses, para ser paranóico assim…

Inté.[/quote]

Preciso detectar que o usuário alterou a data do sistema. O stallone já me passou a idéia. Vou ouvir o sinal wm_timechange por meio de jni. Se alguém tiver outra idéia, também é bem vinda.