102 votes

Fonction qui crée un timestamp en c#

Je me demandais s'il existait un moyen de créer un horodatage en C# à partir d'une date. J'ai besoin d'une valeur d'une précision de l'ordre de la milliseconde qui fonctionne également dans Compact Framework(en disant cela puisque DateTime.ToBinary() n'existe pas dans CF).

Mon problème est que je veux stocker cette valeur dans une base de données agnostique afin que je puisse la trier plus tard et trouver quelle valeur est plus grande que l'autre, etc.

2 votes

La réponse acceptée ici donne une bonne solution, mais si vous voulez un véritable horodatage, consultez cette Q/A : stackoverflow.com/questions/9814060/

207voto

RobV Points 13708

J'utilise toujours quelque chose comme ce qui suit :

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

Vous obtiendrez une chaîne de caractères comme 200905211035131468, car la chaîne de caractères va des bits les plus élevés de l'horodatage aux bits les plus bas. Le tri simple des chaînes de caractères dans vos requêtes SQL peut être utilisé pour ordonner par date si vous placez des valeurs dans une base de données.

5 votes

Comment se fait-il que vous ayez 21 mois et que vous n'en ayez que 12 ? :)

2 votes

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

1 votes

@RobV La question demande une précision de l'ordre de la milliseconde, donc vous avez besoin de 3 'f' à la fin. Vos 4 'f' donnent une précision de 100 microsend.

44voto

Voxel Points 401

Je crois qu'il est possible de créer un horodatage de type Unix précis à la seconde près en utilisant la méthode suivante

//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();

L'ajustement du dénominateur vous permet de choisir votre niveau de précision.

20voto

Frans Bouma Points 6015

Vous pourriez utiliser la propriété DateTime.Ticks, qui est un stockeur long et universel, toujours croissant et utilisable sur le framework compact également. Assurez-vous simplement que votre code n'est pas utilisé après le 31 décembre 9999 ;)

0 votes

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

0 votes

En fait, je viens de l'utiliser et j'ai des valeurs en double à certains endroits.

0 votes

@Jon : par "toujours croissant", je voulais dire : ce n'est pas un compte de tic-tac qui change tous les 48 jours environ, c'est un compte de tic-tac réel qui augmente avec le temps, donc une valeur plus élevée correspond toujours à un horodatage plus tardif.

5voto

Vous pouvez également utiliser

Stopwatch.GetTimestamp().ToString();

2voto

Ian Mercer Points 19271

Si vous voulez des timestamps qui correspondent à des temps réels MAIS que vous voulez aussi qu'ils soient uniques (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;
       }
   }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X