2009-06-08 5 views
2

La plupart des langues ont une sorte de fonction de date où vous n'avez vraiment aucune programmation à faire pour obtenir des informations de date que vous venez de recevoir de la fonction/objet date. Je suis curieux de savoir ce qui se passe dans les coulisses pour y arriver?Comment les ordinateurs calculent-ils les informations de date?

+0

Pourriez-vous être plus précis sur ce que vous énigme ici? – Joey

+2

Beaucoup ... n'écrivez pas les vôtres: P – workmad3

Répondre

8

Chaque ordinateur dispose d'une horloge système qui conserve la date et l'heure. Au niveau le plus bas, les informations de date et d'heure ont été récupérées à partir de là. Au-dessus, ajoutez les informations de fuseau horaire, etc. du système d'exploitation et vous obtenez un objet Date ou similaire. En fonction de votre langue/environnement Les objets de date peuvent eux-mêmes effectuer le calcul de la date ou vous devez utiliser d'autres fonctions pour y parvenir. Ceux-ci veillent à ce que les années bissextiles soient traitées correctement et qu'aucune date invalide ne puisse être créée.

Mais peut-être que j'ai mal compris votre question.

3

La date et l'heure sont généralement fournies par le système d'exploitation. Il s'agit donc d'un appel système. Le système d'exploitation gère l'horloge en temps réel montée sur la carte mère et alimentée par une petite batterie (qui dure plusieurs années).

5

Généralement, un ordinateur enregistre le nombre d'unités écoulées depuis une date et une heure spécifique dans le passé. Dans les systèmes Unix, par exemple, cela pourrait être le nombre de secondes écoulées depuis l'époque Unix, qui est minuit, le 1er janvier 1970 GMT. Sous Windows, il s'agit du nombre d'intervalles de 100 ns depuis 1601-01-0 (merci Johannes Rössel). Ou cela pourrait être quelque chose d'aussi simple que le nombre de secondes depuis la mise sous tension de l'ordinateur.

Donc, à partir du nombre d'unités qui ont passé depuis cette date/heure, un système d'exploitation peut calculer le nombre d'années, mois, jours, etc qui se sont écoulés. Bien sûr, toutes sortes de choses amusantes comme les années bissextiles et les secondes intercalaires doivent être prises en compte pour que cela se produise.

Des systèmes tels que NTP (Network Time Protocol) peuvent être utilisés pour synchroniser le comptage interne d'un ordinateur à des horloges atomiques via un serveur NTP sur un réseau. Pour ce faire, NTP prend en compte le temps d'aller-retour et apprend les types d'erreurs le lien vers le serveur NTP.

+2

Cependant, tous les systèmes date/heure ne sont pas basés sur l'époque. Et tous ceux qui sont basés sur l'époque ne sont pas basés sur la seconde. Windows par exemple utilise des intervalles de 100 ns depuis le 1601-01-01. – Joey

+0

@Johannes Choses cool, je ne savais pas que Windows avait une époque différente à Unix - Je pensais qu'ils étaient tous deux basés sur 1970. – RichardOD

+0

Richard: Windows NT a choisi le début du cycle bissextile de 400 ans à sa conception (1993) Il a commencé à fonctionner en 1601. De plus, comme ils utilisaient une valeur de 64 bits depuis le début, ils n'avaient pas à se soucier d'une période de temps d'environ un siècle. Pourtant, Windows est jonché de formats temporels différents, il y en a au moins deux de plus, dont SYSTEMTIME (une structure simple avec plusieurs champs) et une autre étant une chaîne lisible par l'homme (mais pas le nom maintenant) – Joey

1

Votre ordinateur dispose d'une horloge système et le BIOS dispose d'une fonction de minuterie pouvant être mise à jour depuis votre système d'exploitation. Les langues prennent seulement l'information de là et certaines peuvent la mettre à jour aussi.

3

Bien ... La plupart des ordinateurs contiennent un "real-time clock", qui compte le temps à l'échelle humaine des secondes, minutes, etc. Traditionnellement, il y a une petite pile sur la carte mère, qui permet à la puce de se souvenir de l'heure, ou même continuer à le compter, même lorsque le reste de l'ordinateur est éteint.

De nombreux ordinateurs utilisent aujourd'hui des services tels que network time protocol pour interroger périodiquement une horloge de haute précision centralisée, afin de définir l'heure actuelle. De cette façon, même si la batterie est retirée (ou échoue), l'ordinateur saura toujours l'heure et la date, et pourra mettre à jour (pour corriger les erreurs dans le chronométrage de la puce en temps réel) cette information aussi souvent que nécessaire.

1

Achetez l'un de ces livres au Calendrical Calculations. Ils vous renseigneront sur la façon dont les bibliothèques de données fonctionnent sous le capot.

1

La date et l'heure sont souvent stockées en termes de temps depuis une certaine date. Par exemple des ticks (intervalles de 100 nanosecondes) depuis le 1er janvier 0001. Il est aussi généralement stocké en référence à l'UTC. Les méthodes sous-jacentes dans le système d'exploitation, la base de données, le framework, l'application, etc. peuvent ensuite les convertir en une représentation plus utilisable.À l'époque, les systèmes stockaient des parties de la date, du jour, du mois, de l'année, etc. dans la structure de données, mais nous avons appris notre leçon avec le bazar de l'an 2000 que ce n'est probablement pas la meilleure approche.

3

En dehors de l'horloge en temps réel, les calculs de date sont principalement une fonction de bibliothèque logicielle.

Les dates sont plutôt irrégulières et donc dans les coulisses un mélange d'approximations, de corrections et de tables de recherche sont utilisées.

La représentation d'une date peut également varier, généralement une date de début (arbitraire) est utilisée. Un système commun, également utilisé par les astronomes, est le Julian day numbers (à ne pas confondre avec le Julian calendar). Les dates peuvent être stockées comme secondes-depuis-début ou comme jours-depuis-début (ce dernier est généralement un point flottant). Voici some more algorithms.

+0

The Julian calendrier n'a pas toujours les années bissextiles correctes. Les systèmes modernes utilisent le calendrier grégorien, qui est presque identique à Julian, mais qui corrige les années bissextiles. –

+0

Pas seulement les systèmes modernes - le calendrier julien a été remplacé il y a quelques siècles. Tout est dans la page liée. –

2

Une quantité surprenante d'un code étonnamment compliqué est nécessaire pour l'analyse de la date, le calcul, la création, etc.

Par exemple, en Java, les dates sont calculées, modifiés, stockés etc via le Date, Calendar, et plus précisément et généralement , le Gregorian Calendar implementation of Calendar. En résumé, voici ce que j'ai compris d'une lecture rapide de la source: La gestion de la date est non triviale et n'est pas quelque chose que vous voulez essayer par vous-même. Trouver une bonne bibliothèque si possible, sinon vous serez presque certainement reinventing the square wheel.

1

La plupart des réponses ont trait à la façon dont la date actuelle est obtenue. c'est-à-dire de l'horloge système et ainsi de suite.

Si vous voulez savoir comment il est stocké et utilisé, il existe de nombreuses implémentations différentes et cela dépend du système. Je crois que l'utilisation d'un entier signé de 64 bits dans T-sql est commune. Le 01/01/1970 est 0 alors les nombres négatifs sont avant 1970 et positifs à partir de chaque incrément qui ajoute 100 s de seconde (pense que c'est un 100e aurait besoin de vérifier).

Pourquoi le 01/01/1970 vous pouvez demander cela parce que le calendrier grégorien est sur un cycle de 400 ans. 01/01/1970 étant le début d'un cycle à la date actuelle. Ceci est dû au fait que "Chaque année exactement divisible par quatre est une année bissextile, sauf pour les années qui sont exactement divisibles par 100, les années centurielles qui sont divisibles exactement par 400 sont toujours des années bissextiles. 1900 n'est pas une année bissextile, l'année 2000 est une année bissextile. " Cela rend la chose très compliquée. Je crois que le cycle de 400 ans coïncide avec les jours de la semaine qui se répètent aussi, mais qu'il faudrait vérifier. Fondamentalement, c'est très compliqué.

En interne, il est incroyablement difficile d'écrire la bibliothèque datetime pour toutes ces variations telles que les années bissextiles, le fait qu'il n'y a pas d'année zéro ..... Sans oublier UTC, GMT UT1 fois.

1

Nous avons eu l'occasion lors du débogage d'un problème client de voir comment SQL stocke les datetimes ... assez intéressant et très sensé dès que vous le voyez.

SQL utilise 2 entiers de 4 octets ... Les 4 premiers octets sont la date en jours depuis le 1er janvier 1753. Je crois que l'année maximale est censée être 9999, ce qui ne correspond pas exactement à la nombre d'entiers disponibles dans 4 octets, mais voilà. Les 4 derniers octets correspondent à la durée en millisecondes écoulée depuis minuit.

Questions connexes