Même résultat avec "DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()"
Ramunas
74
Un idiome courant en Java consiste à utiliser le currentTimeMillis()à des fins de synchronisation ou de planification, où vous n'êtes pas intéressé par les millisecondes réelles depuis 1970, mais calculez plutôt une valeur relative et comparez les appels ultérieurs de currentTimeMillis()à cette valeur.
Si c'est ce que vous recherchez, l'équivalent C # est Environment.TickCount.
Mais ils donnent tous les deux des nombres de différence. Comment se comparent-ils correctement? C# give : 2688547etJava give : 1390707872687
Elshan
1
@Elshan Vous ne pouvez pas les comparer. Ce sont des tiques différentes. Cette technique permet de chronométrer et de planifier au sein d'une application, et non entre les applications.
Barend le
System.currentTimeMillis()renvoie l'heure UTC en ms depuis 1970, tandis que Environment.TickCountrenvoie les ms depuis le démarrage de l'application. System.currentTimeMillis()est bon pour vérifier le temps écoulé, mais si vous voulez que deux durées soient comparables, vous devez utiliser System.nanoTime().
michelpm
12
Si vous êtes intéressé par TIMING, ajoutez une référence à System.Diagnostics et utilisez un chronomètre.
Par exemple:
var sw = Stopwatch.StartNew();
...
var elapsedStage1 = sw.ElapsedMilliseconds;
...
var elapsedStage2 = sw.ElapsedMilliseconds;
...
sw.Stop();
DateTime.Now utilise l'heure locale, pas UTC. Je ne sais pas exactement ce qui se passe lorsque vous soustrayez un type inconnu de DateTime d'un type local, mais il est préférable de les régler tous les deux sur UTC :)
Jon Skeet
7
Nous pourrions également avoir un peu de fantaisie et le faire comme une méthode d'extension, de sorte qu'il se bloque hors de la classe DateTime:
N'est-ce pas un peu faux? Cette méthode d'extension passera à n'importe quelle instance de DateTime, mais elle n'utilise pas l'instance. Cela semble juste déroutant ... Je ne pense pas que vous devriez exiger un paramètre que vous n'utilisez pas
mortb
1
@mortb C'est une méthode d'extension. C'est ainsi qu'il est défini en C # pour "ajouter une méthode" à une classe sans modifier la classe. Le compilateur interprète la méthode et peut l'appliquer à une instance du paramètre "this" comme s'il s'agissait d'une méthode d'instance sur la classe elle-même. Elle fonctionne exactement comme une méthode sur la classe statique, mais le compilateur permet d'écrire une syntaxe alternative plus simple.
Suncat2000
1
Le problème est que la valeur du paramètre dn'est pas utilisée. Pour utiliser ce code, vous pourriez écrire var date = new DateTime(); var millis = date.currentTimeMillis();Mais la datevariable serait simplement redondante et son état jamais utilisé. Lorsque vous n'utilisez pas l'état de l'objet, la création d'une méthode d'extension masque simplement le code. La réponse fournie par @Hath est plus simple et donc meilleure (pour moi). Peut-être que @Joel Coehoorn avait l'intention d'utiliser la valeur dplutôt que DateTime.UtcNowdans le corps de la méthode? J'utilise beaucoup les méthodes d'extension, mais pas pour cela.
mortb
Pourquoi créerais-tu une extension qui n'utilise pas la date? J'ai utilisé ce code et il m'a surpris. La version correcte est: return (long) ((d.ToUniversalTime () - Jan1st1970) .TotalMilliseconds);
Mark G
4
Voici un moyen simple de se rapprocher de l'horodatage Unix. L'utilisation de UTC est plus proche du concept unix, et vous devez convertir de doubleà long.
Le framework n'inclut pas les anciennes secondes (ou millisecondes) depuis 1970. Le plus proche que vous obtenez est DateTime.Ticks qui est le nombre de 100 nanosecondes depuis le 1er janvier 0001.
Si vous voulez qu'un horodatage soit comparé entre différents processus, différents langages (Java, C, C #), sous GNU / Linux et Windows (Seven au moins):
Je sais que la question demande l' équivalent, mais puisque j'utilise ces 2 pour les mêmes tâches que je lance dans GetTickCount . Je suis peut-être nostalgique mais System.currentTimeMillis () et GetTickCount () sont les seuls que j'utilise pour obtenir des tiques.
Réponses:
Une alternative:
private static readonly DateTime Jan1st1970 = new DateTime (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); public static long CurrentTimeMillis() { return (long) (DateTime.UtcNow - Jan1st1970).TotalMilliseconds; }
la source
Un idiome courant en Java consiste à utiliser le
currentTimeMillis()
à des fins de synchronisation ou de planification, où vous n'êtes pas intéressé par les millisecondes réelles depuis 1970, mais calculez plutôt une valeur relative et comparez les appels ultérieurs decurrentTimeMillis()
à cette valeur.Si c'est ce que vous recherchez, l'équivalent C # est
Environment.TickCount
.la source
C# give : 2688547
etJava give : 1390707872687
System.currentTimeMillis()
renvoie l'heure UTC en ms depuis 1970, tandis queEnvironment.TickCount
renvoie les ms depuis le démarrage de l'application.System.currentTimeMillis()
est bon pour vérifier le temps écoulé, mais si vous voulez que deux durées soient comparables, vous devez utiliserSystem.nanoTime()
.Si vous êtes intéressé par TIMING, ajoutez une référence à System.Diagnostics et utilisez un chronomètre.
Par exemple:
var sw = Stopwatch.StartNew(); ... var elapsedStage1 = sw.ElapsedMilliseconds; ... var elapsedStage2 = sw.ElapsedMilliseconds; ... sw.Stop();
la source
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
la source
DateTimeOffset
méthode a été introduite à partir de .Net 4.6.le
System.currentTimeMillis()
in java renvoie l'heure actuelle en millisecondes à partir du 1/1/1970c # ce serait
public static double GetCurrentMilli() { DateTime Jan1970 = new DateTime(1970, 1, 1, 0, 0,0,DateTimeKind.Utc); TimeSpan javaSpan = DateTime.UtcNow - Jan1970; return javaSpan.TotalMilliseconds; }
edit: faites-le utc comme suggéré :)
la source
Nous pourrions également avoir un peu de fantaisie et le faire comme une méthode d'extension, de sorte qu'il se bloque hors de la classe DateTime:
public static class DateTimeExtensions { private static DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); public static long currentTimeMillis(this DateTime d) { return (long) ((DateTime.UtcNow - Jan1st1970).TotalMilliseconds); } }
la source
d
n'est pas utilisée. Pour utiliser ce code, vous pourriez écrirevar date = new DateTime(); var millis = date.currentTimeMillis();
Mais ladate
variable serait simplement redondante et son état jamais utilisé. Lorsque vous n'utilisez pas l'état de l'objet, la création d'une méthode d'extension masque simplement le code. La réponse fournie par @Hath est plus simple et donc meilleure (pour moi). Peut-être que @Joel Coehoorn avait l'intention d'utiliser la valeurd
plutôt queDateTime.UtcNow
dans le corps de la méthode? J'utilise beaucoup les méthodes d'extension, mais pas pour cela.Voici un moyen simple de se rapprocher de l'horodatage Unix. L'utilisation de UTC est plus proche du concept unix, et vous devez convertir de
double
àlong
.TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)); long millis = (long)ts.TotalMilliseconds; Console.WriteLine("millis={0}", millis);
imprime:
millis=1226674125796
la source
Le framework n'inclut pas les anciennes secondes (ou millisecondes) depuis 1970. Le plus proche que vous obtenez est DateTime.Ticks qui est le nombre de 100 nanosecondes depuis le 1er janvier 0001.
la source
Je considère simplement le moyen le plus simple de réaliser ce que vous recherchez comme suit:
DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond
la source
DateTime.UtcNow
est une meilleure optionSi vous voulez qu'un horodatage soit comparé entre différents processus, différents langages (Java, C, C #), sous GNU / Linux et Windows (Seven au moins):
C #:
private static long nanoTime() { long nano = 10000L * Stopwatch.GetTimestamp(); nano /= TimeSpan.TicksPerMillisecond; nano *= 100L; return nano; }
Java:
java.lang.System.nanoTime();
C GNU / Linux:
static int64_t hpms_nano() { struct timespec t; clock_gettime( CLOCK_MONOTONIC, &t ); int64_t nano = t.tv_sec; nano *= 1000; nano *= 1000; nano *= 1000; nano += t.tv_nsec; return nano; }
C Windows:
static int64_t hpms_nano() { static LARGE_INTEGER ticksPerSecond; if( ticksPerSecond.QuadPart == 0 ) { QueryPerformanceFrequency( &ticksPerSecond ); } LARGE_INTEGER ticks; QueryPerformanceCounter( &ticks ); uint64_t nano = ( 1000*1000*10UL * ticks.QuadPart ) / ticksPerSecond.QuadPart; nano *= 100UL; return nano; }
la source
Je sais que la question demande l' équivalent, mais puisque j'utilise ces 2 pour les mêmes tâches que je lance dans GetTickCount . Je suis peut-être nostalgique mais System.currentTimeMillis () et GetTickCount () sont les seuls que j'utilise pour obtenir des tiques.
[DllImport("kernel32.dll")] static extern uint GetTickCount(); // call uint ticks = GetTickCount();
la source