2009-12-29 4 views
2

Je dois transférer la date et l'heure du système d'exploitation actuel jusqu'à la précision de la micro-seconde de la partie A à la partie B via TCP/IP.Quel est le plus petit nombre d'octets pour représenter la date et l'heure?

  • Quel est le plus petit nombre d'octets qui peut être utilisé pour représenter ce sans sacrifier la précision? Comment convertir la date et l'heure au format d'octets en utilisant C#?

Répondre

9

Le nombre minimum de bits serait d'utiliser microsecondes depuis un point fixe dans le temps. Mais quand vous faites cela, à un certain moment dans le futur, vos horodatages déborderont.

Si vous sélectionnez le point fixe dans le temps comme hier par exemple. alors 5 octets suffiront pour encoder les temps d'hier jusqu'au milieu de la semaine prochaine.

Mais cela semble inutilement compliqué. DateTime.Tick utilise seulement 8 octets d'espace. il est précis à 1/10e de microsecondes et couvre tous l'histoire humaine, il fait référence à un point défini dans le temps (1 Janvier, année 1) et surtout, sa norme

+0

Afin d'utiliser DateTime.Tick, je dois choisir un point fixe dans le temps, non? Existe-t-il une norme pour choisir ce point fixe dans le temps? – Lopper

+0

@Lopper, NON vous n'avez pas besoin de choisir un point fixe dans le temps. System.DateTime l'a fait pour vous. – Portman

+0

Ce que dit Portmain. Vous avez seulement besoin de choisir un point dans le temps si vous n'utilisez pas le standard. –

1

la DateTime.Tick est la représentation de format binaire de datetime

1

Apparemment DateTime.Ticks peut représenter le temps jusqu'au niveau de la nanoseconde, à partir de l'année 0001. Selon l'affiche ci-dessus, il faut 8 octets d'espace.

Cependant, pour obtenir une représentation minimale pour tous les micro-secondes de l'année 0000 à l'année 9999, vous pouvez le calculer comme suit:

9999 ans * 365 jours * 24 h * 60 min * 60 secondes * 1000000 microsecondes = 525547400000

ln (ci-dessus nombre)/ln (2) = 52,22274 .. - 53 bits

53 bits = 6,5 octets. Donc, vous pouvez enregistrer un octet en utilisant une représentation non-standard (en gros, vous économisez en n'ayant pas à représenter des nanosecondes). L'écriture des routines de conversion est assez simple. Il suffit de convertir chaque date, heure, milliseconde à la milliseconde appropriée entre le début de l'année 0000 et l'année 9999. Pour retrouver l'heure de la date, il suffit de faire le calcul inverse. C'est assez simple, vous devriez être capable de le comprendre.

Cependant, je doute fortement économiser 1 octet vaut le travail, les bugs potentiels, non-normalisation, maintenance, documentation, etc., etc.

+0

Point secondaire, DateTime.Tics est précis à 100 nanosecondes, soit 1/10 de microseconde. il n'est pas précis à la nanoseconde –

0

Réponse: un nombre infini d'octets.

Raison: voir la réponse de John Knoeller. Fondamentalement, si vous choisissez un nombre fini de bits, alors il ne peut représenter qu'un nombre fini de points dans le temps. Puisque le temps s'étend à l'infini dans le passé et le futur, il ne sera pas capable de représenter un certain nombre (en fait un nombre infini d'occurrences) dans le temps.

Ce serait une bonne entrevue question :)

+1

Pas forcément infinie, ça fait seulement 14 G ans depuis le big bang, et on ne sait pas combien de temps nous allons durer. Néanmoins, je vous ai donné +1! –

+0

Le temps est une variable continue, donc il y a une infinité de moments dans n'importe quelle période de temps. – Rik

+1

@Doug Currie - vous supposez que cette application ne fait référence qu'à l'heure actuelle dans l'histoire et non à un futur infini. Cela pourrait être une application d'astronomie essayant de calculer des positions d'étoiles des milliards et des milliards d'années à partir de maintenant. – JeffO

1

Si vous êtes toujours y compris microsecondes, vous pourriez aussi bien utiliser le nombre fixe d'octets comme déjà discuté - cependant, si cela est objectif général sérialisation vous pourriez vouloir exploiter le fait que beaucoup de valeurs régulières ont des valeurs de date ou d'heure. Pour protobuf-net, il marque l'échelle (jours, heures, minutes, secondes, millisecondes ou ticks) et envoie le nombre entier de [quelconque] entre le temps donné et une époque arbitraire (1/1/1970). Pour minimiser encore cela, l'entier est passé avec un codage de longueur variable, permettant à la plupart des valeurs communes d'être transmises très commodément. Cela lui permet d'envoyer des choses comme des valeurs de date dans un nombre minimal d'octets.

1

Je dois critiquer la réponse de Larry Watanabe.

Vous pouvez, en fait, représenter l'heure en microsecondes en utilisant un seul octet. Vous ne pouvez représenter que les temps dans les 255 microsecondes du début de votre époque, ce qui peut ou non être une limitation significative en fonction de vos autres besoins.

Questions connexes