Pergunta

Conta o href="http://msdn.microsoft.com/en-us/library/ms724284(VS.85).aspx" rel="nofollow estrutura FILETIME de janeiro 1 1601 (presumivelmente o início do dia) de acordo com a documentação da Microsoft, mas isso inclui segundos bissextos?

Foi útil?

Solução

A questão não deve ser se FILETIME inclui segundos bissextos.

Ele deve ser:

Será que as pessoas, funções e bibliotecas, que interpretam um FILETIME (ou seja FileTimeToSystemTime) incluem segundos bissextos quando contando a duração?

A resposta simples é "não" . retorna segundos FileTimeToSystemTime como 0..59.


A resposta mais simples é: " claro que não, como poderia ?".

A minha máquina Windows 2000 não saber que havia 2 segundos bissextos adicionados na década desde que foi lançado. Qualquer interpretação que faz de uma FILETIME está errado.


Finalmente, em vez de confiar na lógica, podemos determinar pela observação experimental direta, a resposta para a pergunta cartazes:

var
    systemTime: TSystemTime;
    fileTime: TFileTime;
begin
    //Construct a system-time for the 12/31/2008 11:59:59 pm
    ZeroMemory(@systemTime, SizeOf(systemTime));
    systemtime.wYear := 2008;
    systemTime.wMonth := 12;
    systemTime.wDay := 31;
    systemTime.wHour := 23;
    systemtime.wMinute := 59;
    systemtime.wSecond := 59;

    //Convert it to a file time
    SystemTimeToFileTime(systemTime, {var}fileTime);

    //There was a leap second 12/31/2008 11:59:60 pm
    //Add one second to our filetime to reach the leap second
    filetime.dwLowDateTime := fileTime.dwLowDateTime+10000000; //10,000,000 * 100ns = 1s

    //Convert the filetime, sitting on a leap second, to a displayable system time
    FileTimeToSystemTime(fileTime, {var}systemTime);

    //And now print the system time
    ShowMessage(DateTimeToStr(SystemTimeToDateTime(systemTime)));

A adição de um segundo para

12/31/2008 11:59:59pm

1/1/2009 12:00:00am

em vez de

1/1/2009 11:59:60pm

Q.E.D.

poder cartaz original não como ele, mas deus manipulado intencionalmente para que um ano não é divisível por um dia. Ele fez isso apenas para estragar programadores.

Outras dicas

Aqui de alguns mais informações sobre por que determinado data foi escolhida.

A estrutura FILETIME registra o tempo em a forma de intervalos de 100 nanossegundos desde 1 de Janeiro de 1601. Por que foi que data escolhida?

O calendário gregoriano opera em uma 400 ciclo-ano, e 1601 é o primeiro ano do ciclo que estava ativo no o tempo Windows NT foi sendo projetado. Em outras palavras, era escolhidos para fazer a matemática sair bem.

Na verdade, tenho o e-mail de Dave Cutler confirmando isso.

Não pode haver uma resposta única para esta questão sem primeiro decidir: qual é o FILETIME o Windows realmente contando? Os documentos da Microsoft dizem que conta 100 intervalos nanosegundos desde 1601 UTC, mas isso é problemático.

No formulário de tempo coordenada internacionalmente existia antes do ano de 1960. A UTC próprio nome não ocorre em qualquer literatura antes de 1964. O nome UTC como uma designação oficial não existia até 1970. Mas é ainda pior. O Observatório Real de Greenwich não foi estabelecida até 1676, por isso mesmo tentando interpretar o FILETIME como GMT não tem significado claro, e foi só nessa época que relógios de pêndulo com escapamentos precisos começou a dar precisões de 1 segundo.

Se FILETIME é interpretado como médios segundos solares, em seguida, o número de segundos bissextos desde 1601 é zero, para UT não tem segundos bissextos. Se FILETIME é interpretado como se houvesse cronômetros atômicas, em seguida, o número de segundos bissextos desde 1601 é cerca de -60 (que é negativo 60 segundos bissextos).

Isso é história antiga, que sobre a era desde cronômetros atômicas? Ele não é melhor porque os governos nacionais não fizeram a distinção entre segundos solar médio e segundos SI. Durante uma década a ITU-R vem discutindo abandonando segundos bissextos, mas eles não conseguiram consenso internacional. Parte da razão para isso pode ser visto no JavaScript nesta página (também veja o link delta-T nessa página para parcelas da história antiga). Porque os governos nacionais não fizeram uma distinção clara, qualquer tentativa de definir a contagem de segundos desde 1972 corre o risco de ser de acordo com inválidas as leis de algumas jurisdições. Os delegados ITU-R estão cientes dessa complexidade, como são as pessoas no comitê POSIX. Até que as questões diplomáticas são trabalhados, até que os governos nacionais e as normas internacionais fazer uma distinção clara e escolha entre médios solares e SI segundos, há pouca esperança de que as normas de computador podem seguir o exemplo.

Leap segundos são adicionados de forma imprevisível pelos IERS. 23 segundos foram adicionados desde 1972, quando UTC e segundo salto foram definidos. Wikipedia diz que "porque a taxa de rotação da Terra é imprevisível, a longo prazo, não é possível prever a necessidade de-los mais de seis meses de antecedência."

Uma vez que você tem que manter um histórico de quando foram inseridos segundos bissextos, e manter a atualização do sistema operacional para manter uma referência de quando tinha sido inserido, e a diferença é tão pequena, é justo não esperar uma geral- propósito OS para compensar segundos bissextos.

Além disso, deriva relógio regular, do relógio eletrônico simples em seu PC em comparação com UTC, é muito maior do que a compensação necessária para segundos bissextos. Se você precisar o tipo de precisão para compensar segundo salto, você não deve usar o relógio PC altamente impreciso.

A resposta a esta pergunta costumava ser que não, mas foi alterado para: SIM, espécie de, às vezes ...

Por o Windows Networking artigo equipe do blog :

A partir de Servidor 2019, o Windows 10 outubro [de 2018] APIs de tempo de atualização irá agora ter em conta todos os segundos bissextos o sistema operacional está ciente de quando se traduz FILETIME para SYSTEMTIME.

Como não houve segundos bissextos emitidos desde o tempo de esse recurso ser adicionado, o sistema operacional ainda não tem conhecimento de quaisquer segundos bissextos. No entanto, quando o próximo salto oficial segunda faz o seu caminho para o mundo, os computadores Windows que têm este novo recurso habilitado irá acompanhar-lo, e valores assim FILETIME será compensado pelo número de segundos bissextos no computador no momento em que são interpretado.

O post continua a descrever:

Nenhuma alteração é feita para FILETIME. Ainda representa o número de intervalos de 100 ns desde o início da época. O que mudou é a interpretação desse número quando ele é convertido em SYSTEMTIME e costas. Aqui está uma lista de APIs afetadas:

  • GetSystemTime
  • GetLocalTime
  • FileTimeToSystemTime
  • FileTimeToLocalTime
  • SystemTimeToFileTime
  • SetSystemTime
  • SetLocalTime

Antes deste lançamento, SYSTEMTIME teve valores válidos para wSecond entre 0 e 59. SYSTEMTIME agora foi atualizado para permitir que um valor de 60, desde o ano, mês, dia e representa o dia em que um segundo salto é válido.

...

De modo a receber 60 segundo na estrutura SYSTEMTIME um processo deve explicitamente opt-in.

Note que o opt-in se aplica ao comportamento dentro das funções listadas em como uma FILETIME é mapeado para um SYSTEMTIME. Independentemente de você opt-in ou não, o sistema operacional irá valores FILETIME ainda compensado de acordo com os segundos bissextos de que tenha conhecimento.

No que diz respeito à compatibilidade, o artigo afirma:

Os aplicativos que dependem de estruturas 3o partido deve assegurar a implementação do seu quadro no Windows também está chamando para as APIs corretas para calcular o tempo correto, ou então a aplicação terá o tempo errado relatados.

e também fornece um links para um anteriormente post que descreve como desativar o recurso inteiro, como se segue:

... você pode reverter para o comportamento do sistema operacional anterior e desativar segundos bissextos através da placa, adicionando a seguinte chave do registro:

  • HKLM:\SYSTEM\CurrentControlSet\Control\LeapSecondInformation
  • Tipo: "REG_DWORD"
  • Nome: Ativado
  • Valor: 0 desativa a configuração de todo o sistema
  • Valor: 1 Permite a configuração de todo o sistema

Em seguida, reiniciar o sistema.

Um resumo muito crua:

UTC = (Tempo Atômico) + (segundo salto) ~~ (Mean Time Solar)

A documentação MS diz, especificamente, "UTC", e por isso deve incluir os segundos bissextos. Como sempre acontece com MS, sua milhagem pode variar.

De acordo com esta janelas comentário é totalmente inconsciente de segundos bissextos. Se você adicionar 24 * 60 * 60 segundos para um FILETIME que representa 01:39:45 hoje, você recebe um FILETIME que representa 01:39:45 amanhã, não importa o quê.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top