Karasal olmayan bir takvimin uygulanması


91

Başka bir soru için çözümler ararken, kendimi .NET'in Calendarsınıfını Dünya kurallarına dayalı olmayan bir takvimi uygulamak için kullanmanın mümkün olup olmadığını merak ederken buldum .

Örneğin, Mars'ın günü Dünya'daki bir günden yaklaşık% 2,7 daha uzundur:

Bugüne kadar uzay aracı iniş projeleri tarafından kullanılan bir kural, saatlerin, dakikaların ve saniyelerin standart (Dünya) sürelerinden% 2,7 daha uzun olduğu 24 saatlik bir "Mars saati" kullanarak yerel güneş zamanını takip etmektir.

Bir uygulamaya iyi bir yolu var mı MarsCalendarsaniyenin uzunluğu standardından farklı olacak şekilde GregorianCalendarve bu nedenle kullanıma muktedir DateTimestandardını herkes için buna dayalı nesnelerin AddDays(), AddHours()vb fonksiyonlar? (Not: İdeal olarak, bir çözüm - eğer varsa - tutarlı uzunluklarda hem "1 gün" hem de "1 yıl" tanımlamanın mümkün olduğu herhangi bir gezegen nesnesi biçimine uygulanabilir. Mars harika bir örnek oluştursa da )


5
hmmm ilk gördüğüm zaman olacağını Marslılar P: Bizim teknolojisine bağımlı
user2711965

17
"Günün en iyi sorusu" için bir rozet olmalı ve bu onu kazanmalı!
Sean

4
@DavidKhaykin - Bir günden daha büyük bir şeye ulaştığınızda,% 2,7'lik dönüşüm bozulur. Saat / dakika / saniye dönüş hızına bağlıdır, Günler / Aylar / Yıllar ise yörünge hızına bağlıdır. Öte yandan, Calendarher yıl rastgele gün sayılarının belirlenmesini zaten destekliyor.
Bobson

5
Bilginize, bu bir C # Calendarsınıfı değil. Aynı sınıf, VB.NET veya başka herhangi bir .NET dili tarafından kullanılabilir. Bu .NET Calendarsınıfıdır.
John Saunders

4
Bu biraz ilginç. Yeryüzüne dayalı HERHANGİ bir takvim, Mars'taki zamanı izleme bağlamında anlamsız olacaktır. Dünya zamanında Mars 29 saat, 39 dakika, 35 saniyede dönüyor. Bir Mars yılı 1.8809 Dünya yılıdır. Ancak Mars referans çerçevenizse, bunların hepsi anlamsızdır. Gününüz, Mars'ın ekseni etrafında bir kez dönmesi ne kadar uzun sürerse sürüyor. Bunu uygun sayıda dilime böldüğünüzde "saatler" elde edersiniz. Bunları bölün, dakikalar elde edin, bunları bölün ve saniye elde edin. Bölümler sadece matematiksel olarak kullanışlıdır ve onlara atfettiğimizin ötesinde hiçbir anlamı yoktur.
Craig

Yanıtlar:


13

System.Globalization.CalendarKüreselleşme ad alanı (yani JapaneseCalendar) içinden türetilen birkaç Gregoryen olmayan takvim sınıfı vardır . Kendinizinkini uygulayabilmelisiniz. Bir örnek hazırlardım ama Takvim sınıfında 16 soyut yöntem var ...

Hatta, sınıfınızı basitçe yöntemden türetebilir GregorianCalendarve GetMilliseconds(DateTime)yöntemi geçersiz kılarak, tabanın dönüş değerini çarpılarak döndürebilirsiniz 1.027d.


2
İlginç. Bu, daha büyük zaman aralıklarına yayılır mı, yoksa her birini ayrı ayrı geçersiz kılmak zorunda mıyım?
Bobson

2
Diğer takvimler üzerinde biraz daha araştırma yaptıktan sonra, GregorianCalendar ve diğer takvimlerin, tüm GetX yöntemlerinin ardındaki matematik için kendisine iletilen her DateTime'ın Ticks özelliğini kullandığını tahmin ediyorum. DateTime değerleri karmaşıklaşır, çünkü DayOfYear, DayOfMonth ve DayOfWeek özellikleri dünyasal değerlere kenetlenir. Sahip dahili System.Globalization ad için hiçbir takvimler vardır daha ben geçersiz kılınan olamaz o kenetlenmiş değerlerini tahmin ediyorum bu yüzden gerekebilir böylece (bazı daha az gün var gerçi) den 12 ay veya daha fazla 365 gün, kendi DateTime yapınız.
Michael Hoffmann
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.