2009-03-13 6 views
0

HITIMESTAMP UTC Entier

J'ai une base de données existante avec un champ contenant un entier représentant un datetime en UTC

De la documentation: « Horodatage dans un CDR apparaissez dans Universal Coordinated Time (UTC) . Cette valeur reste indépendante des changements de l'heure d'été »

un exemple d'une valeur est 1236772829.

Ma question est quelle est la meilleure façon de le convertir en un .N ET DateTime (dans le code CLR, pas dans la base de données), à la fois comme valeur UTC et comme valeur d'heure locale.

J'ai essayé de le google mais sans aucune chance.

Merci à l'avance /Johan

Répondre

3

Googling cette phrase exacte me donne this Cicso page, qui poursuit en disant "Le champ spécifie une valeur time_t qui est obtenue du système d'exploitation. "

time_t est un concept de bibliothèque C qui, strictement parlant ne doit pas être une mise en œuvre particulière, mais généralement pour les systèmes UNIX-y sera le nombre de secondes depuis le début de l'Unix époque, 1970 1er janvier 00:00.

supposer que ce soit à droite, ce code vous donnera un DateTime d'un int:

 DateTime epochStart = new DateTime(1970, 1, 1); 

     int cdrTimestamp = 1236772829; 

     DateTime result = epochStart.AddSeconds(cdrTimestamp); 

     // Now result is 2009 March 11 12:00:29 

Vous devriez vérifier les résultats Sanity que vous obtenez pour confirmer que c'est l'interprétation correcte de ces time_t s.

4

Vous aurez besoin de savoir ce que l'entier signifie vraiment. Ce sera généralement composé de:

  • Une époque/offset (à savoir ce que 0 signifie) - par exemple « minuit 1 janvier 1970 »
  • Une échelle, par exemple secondes, millisecondes, ticks.

Si vous pouvez obtenir deux valeurs et ce qu'elles signifient en termes d'UTC, le reste devrait être facile. La manière la plus simple serait probablement d'avoir un DateTime (ou DateTimeOffset) comme l'époque, puis de construire un TimeSpan à partir de l'entier, par ex. TimeSpan.FromMilliseconds etc. Ajoutez les deux ensemble et vous avez terminé. EDIT: En utilisant AddSeconds ou AddMilliseconds selon aakashm's answer est un moyen plus simple de faire ce bit :)

Sinon, faire le calcul vous-même et appeler le DateTime constructor which takes a number of ticks. (On peut dire que la version qui prend un DateTimeKind serait aussi mieux, donc vous pouvez explicitement indiquer que c'est UTC.)

+0

Vous pouvez également deviner que l'exemple de @ Jon est correct et voir si vos dates ont un sens si elles sont mesurées comme un décalage à partir du 1/1/1970. Je suppose qu'ils le font. – tvanfosson