Implementando um calendário não terrestre

91

Enquanto procurava soluções para outra questão, me perguntei se seria possível usar a Calendarclasse .NET para implementar um calendário que não fosse baseado nas convenções terrestres.

Por exemplo, o dia de Marte é cerca de 2,7% mais longo do que um dia aqui na Terra:

Uma convenção usada por projetos de sondas espaciais até agora tem sido manter o controle da hora solar local usando um "relógio de Marte" de 24 horas no qual as horas, minutos e segundos são 2,7% mais longos do que suas durações padrão (Terra).

Existe alguma boa maneira de implementar uma MarsCalendartal forma que o comprimento de um segundo é diferente do padrão GregorianCalendar, e, assim, ser capaz de usar DateTimeobjetos com base nele para todo o padrão AddDays(), AddHours()etc. funções? (Nota: Idealmente, uma solução - se houver - seria aplicável a qualquer forma de objeto planetário para o qual seja possível definir "1 dia" e "1 ano" de comprimentos consistentes. Marte é um ótimo exemplo, embora )

Bobson
fonte
5
hmmm essa seria a primeira vez que vejo marcianos dependentes de nossa tecnologia: P
usuário2711965
17
Deveria haver um distintivo para "Melhor pergunta do dia", e esta deveria ganhar!
Sean
4
@DavidKhaykin - Quando você chega a algo maior que um dia, a conversão de 2,7% é quebrada. Horas / minutos / segundos são baseados na velocidade de rotação, enquanto Dias / Meses / Anos são baseados na velocidade da órbita. Por outro lado, Calendarjá suporta a definição de números arbitrários de dias por ano.
Bobson
5
FYI, não é uma Calendarclasse C # . A mesma classe pode ser usada por VB.NET ou qualquer outra linguagem .NET. É a Calendarclasse .NET .
John Saunders
4
Isso é interessante. QUALQUER calendário baseado na Terra seria simplesmente inútil no contexto do rastreamento do tempo em Marte. No tempo da Terra, Marte gira em 29 horas, 39 minutos e 35 segundos. Um ano marciano corresponde a 1.8809 anos terrestres. Mas se Marte é o seu quadro de referência, tudo isso não tem sentido. Seu dia é o tempo que leva para Marte girar em torno de seu eixo uma vez. Divida isso em um número conveniente de fatias, você terá "horas". Divida esses, você obtém minutos, divida aqueles e você obtém segundos. As divisões são apenas matematicamente úteis, sem nenhum significado além do que atribuímos a elas.
Craig

Respostas:

13

Existem várias classes de calendário não gregoriano derivadas de System.Globalization.Calendardentro do namespace Globalization (isto é JapaneseCalendar). Você deve ser capaz de implementar o seu próprio. Eu prepararia uma amostra, mas existem 16 métodos abstratos na classe Calendar ...

Você pode até mesmo ser capaz de simplesmente derivar sua classe GregorianCalendare apenas substituir o GetMilliseconds(DateTime)método, retornando o valor de retorno da base multiplicado por 1.027d.

Michael Hoffmann
fonte
2
Interessante. Isso se propagaria para incrementos de tempo maiores ou eu teria que substituir cada um separadamente?
Bobson
2
Depois de um pouco mais de pesquisa nos outros calendários, acho que GregorianCalendar e os outros calendários usam a propriedade Ticks de cada DateTime transmitida a ele para a matemática por trás de todos os seus métodos GetX. Isso se complica com os valores DateTime, porque as propriedades DayOfYear, DayOfMonth e DayOfWeek estão restritas a valores terrenos. Não há calendários integrados ao namespace System.Globalization que têm mais de 12 meses ou mais de 365 dias (embora alguns tenham menos dias), então estou supondo que esses valores fixos não podem ser substituídos, então você pode precisar sua própria estrutura DateTime.
Michael Hoffmann,