95

Je me demandais, est-il possible de créer un horodatage dans C# à partir d'un datetime? J'ai besoin d'une valeur de précision en millisecondes qui fonctionne également dans Compact Framework (en disant que puisque DateTime.ToBinary() n'existe pas dans CF).Fonction qui crée un horodatage dans C#

Mon problème est que je veux conserver cette valeur dans une base de données façon agnostique donc je peux sortBy plus tard et savoir quelle valeur est supérieure d'une autre, etc.

+2

La réponse acceptée donne ici une bonne solution, mais si vous voulez un horodatage réel, consultez ce Q/R: http://stackoverflow.com/questions/ 9814060/comment convertir-datetime-en-timestamp-en-utilisant-c-netignoring-current-timezone/9814280 # 9814280 – inanutshellus

Répondre

189

J'utilise toujours quelque chose comme ce qui suit:

public static String GetTimestamp(this DateTime value) 
{ 
    return value.ToString("yyyyMMddHHmmssfff"); 
} 

Cela vous donnera une chaîne comme 200905211035131468, comme la chaîne va de premier ordre

+4

Comment obtenez-vous 21 mois et seulement 12? :) – PaulB

+1

faute de frappe de ma part, corrigé maintenant – RobV

+2

Le jeton pour l'année doit être en minuscules ici: return value.ToString ("yyyyMMddHHmmssffff"); –

18

Vous pouvez utiliser la propriété DateTime.Ticks, qui est un stockable long et universel, toujours croissant et utilisable sur le cadre compact. Assurez-vous que votre code est pas utilisé après le 31 Décembre 9999;)

+0

hmmm intéressant, je vais l'essayer. – Konstantinos

+0

Quand vous dites "toujours croissant" - il n'y a aucune garantie que deux appels à DateTime.UtcNow.Ticks donneront des valeurs différentes, n'est-ce pas? En d'autres termes, vous devez toujours faire preuve de prudence avant de l'utiliser comme un horodatage unique. –

+0

effectivement je l'ai juste utilisé et j'ai des valeurs en double à certains points. – Konstantinos

41

Je crois que vous pouvez créer une datation de style unix précise à une seconde en utilisant les éléments suivants:

//Find unix timestamp (seconds since 01/01/1970) 
long ticks = DateTime.UtcNow.Ticks - DateTime.Parse("01/01/1970 00:00:00").Ticks; 
ticks /= 10000000; //Convert windows ticks to seconds 
timestamp = ticks.ToString(); 

Réglage du dénominateur vous permet de choisir votre niveau de précision

+0

Und que 1 fonctionne sur .NET Compact Framework? – ppumkin

+1

Pour une meilleure solution, voir: http://stackoverflow.com/a/26225744/187650 – juFo

3

Si vous voulez horodatages qui correspondent à des temps réels réels, mais veulent aussi leur être unique (pour une instance d'application donnée), vous pouvez utiliser le code suivant :

public class HiResDateTime 
{ 
    private static long lastTimeStamp = DateTime.UtcNow.Ticks; 
    public static long UtcNowTicks 
    { 
     get 
     { 
      long orig, newval; 
      do 
      { 
       orig = lastTimeStamp; 
       long now = DateTime.UtcNow.Ticks; 
       newval = Math.Max(now, orig + 1); 
      } while (Interlocked.CompareExchange 
         (ref lastTimeStamp, newval, orig) != orig); 

      return newval; 
     } 
    } 
} 
7

Vous pouvez également utiliser

Stopwatch.GetTimestamp() ToString();.

2

quand u besoin en quelques secondes:

var timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds; 
Questions connexes