2009-08-09 5 views
2

Je dois représenter des dates antérieures au 1 er janvier 1. Connaissez-vous une bibliothèque qui inclut un tel type?Existe-t-il un type BigDateTime pour .net?

Il devrait fournir les fonctionnalités suivantes:

  • Ajouter/Soustraire
  • BigTimeSpan
  • Grand/Moins de comparaison

Il serait correct si les valeurs seraient moins exactement la plus la date est il y a.

+2

Si vous allez plus loin que l'année 1, je ne peux pas imaginer que vous ayez besoin de pièces de date à l'heure/minute/seconde. Ne pouvez-vous pas simplement utiliser des entiers simples enveloppés dans votre propre objet personnalisé? –

+0

Je ne sais pas à l'avance si le jour sera une date moderne exacte ou une année dans le passé. – weiqure

+0

Je veux éviter d'utiliser simplement des entiers enveloppés car il serait difficile de calculer un décalage horaire. Par exemple, si je comptais toujours un mois comme 31 jours, le 30 septembre et le 1er octobre seraient plus éloignés que le 31 août et le 1er septembre. Je le considérerai cependant, je pourrais utiliser un DateTime si la date est moderne. – weiqure

Répondre

4

Il y avait 445 jours en 45 avant JC, vous devrez donc ajouter cela, et passer de Julian (45bc) au calendrier romain précédent. Le changement de calendrier grégorien est venu beaucoup plus tard (1500s) que vous avez besoin donc vous n'avez pas à vous en préoccuper.

Les deux principaux problèmes de l'utilisation de DateTime sont les constantes min et max. Évidemment, étant une structure, vous ne pouvez pas la sous-classer non plus.

Ma première option serait d'écrire ma structure BigDateTime ou BCDateTime, et d'utiliser un DateTime à l'intérieur de cette composition. Vous pouvez ensuite définir votre calendrier en cours:

CultureInfo.CurrentCulture.DateTimeFormat.Calendar = new JulianCalendar(); 

pour la Julian une, mais comme je l'ai mentionné que vous donne seulement à 45 ans avant notre ère

Si l'année est inférieure à 45 vous passez à nouveau Calendriers à votre propre sous-classé Calendar objet. Si l'année est 45, vous aurez besoin d'un autre calendrier avec les 445 jours pour cette année (ils l'ont fait pour ajuster entre l'ancien calendrier). Quelles seront vos constantes min et max pour cet objet? L'aube de la civilisation elle-même ?!

Vous aurez besoin de choisir ceux-ci, et aussi à l'esprit le calendrier julien et sa version précédente non-réformée étaient spécifiques pour les pays de l'empire romain. Étant un occidental je n'ai aucune idée des autres calendriers qui existaient, vous obtiendrez beaucoup plus d'information de thewikipediaarticlesthough.

Si vous choisissez de faire toutes les cultures, alors vous avez une énorme tâche à accomplir (comme l'a fait l'équipe .NET originale) pour implémenter des calendriers qui existent déjà. Différents calendriers ont différentes époques de départ par rapport à la Colombie-Britannique, tels que les calendriers islamiques, chinois et hindous. Plus d'informations à ce sujet est here.Donc, si vous voulez que chaque culture et non pas seulement l'empire romain, vous devrez faire votre propre version de ce qui suit, ou du moins certains d'entre eux:

System.Globalization.Calendar 
    System.Globalization.EastAsianLunisolarCalendar 
    System.Globalization.GregorianCalendar 
    System.Globalization.HebrewCalendar 
    System.Globalization.HijriCalendar 
    System.Globalization.JapaneseCalendar 
    System.Globalization.JulianCalendar 
    System.Globalization.KoreanCalendar 
    System.Globalization.PersianCalendar 
    System.Globalization.TaiwanCalendar 
    System.Globalization.ThaiBuddhistCalendar 
    System.Globalization.UmAlQuraCalendar 

Bonne chance! Ce serait intéressant de voir comment ça se passe.

+0

Envelopper une DateTime semble être une solution plutôt rapide et agréable. La meilleure solution dépend du type de précision requis dans ces dates pré-Dark Age - années, mois, jours ...? –

2

Jetez un oeil à this thread on SO avec exactement la même question. Fondamentalement, il n'y a pas de support intégré, vous aurez donc besoin de trouver une implémentation tierce ou de la construire vous-même.

+0

Connaissez-vous une bibliothèque pour cela? – weiqure

+0

Jetez un oeil sur le lien. Il contient des informations sur la façon dont vous allez construire une classe pour gérer cela. –

+0

Le lien dans le lien montre seulement un moyen de représenter les années BC et AD. J'ai aussi besoin de dates (et peut-être de temps). – weiqure

1

Si vous avez vraiment besoin de ces trois opérations (ce qui signifie pas de jour de la semaine, jour du mois, les fuseaux horaires, etc.): il suffit d'utiliser autant que nombre de secondes (ou millisecondes) à partir de la date du pivot. 2^64 secondes vous donnent un demi-billion d'années.

Questions connexes