Что эквивалентно Java System.currentTimeMillis()
в C #?
Ответы:
Альтернатива:
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;
}
Распространенной идиомой в Java является использование currentTimeMillis()
для целей синхронизации или планирования, когда вас не интересуют фактические миллисекунды с 1970 года, а вместо этого вычисляется некоторое относительное значение и сравнивается более поздние вызовы currentTimeMillis()
с этим значением.
Если это то, что вы ищете, эквивалент в C # Environment.TickCount
.
C# give : 2688547
иJava give : 1390707872687
System.currentTimeMillis()
возвращает время UTC в мс с 1970 года, а Environment.TickCount
возвращает мс с момента запуска приложения. System.currentTimeMillis()
хорош для проверки прошедшего времени, но если вы хотите, чтобы две длительности были сопоставимы, вы должны использовать System.nanoTime()
.
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
DateTimeOffset
метод был введен в .Net 4.6.
System.currentTimeMillis()
в Java возвращает текущее время в миллисекундах от 1/1/1970
c # это было бы
public static double GetCurrentMilli()
{
DateTime Jan1970 = new DateTime(1970, 1, 1, 0, 0,0,DateTimeKind.Utc);
TimeSpan javaSpan = DateTime.UtcNow - Jan1970;
return javaSpan.TotalMilliseconds;
}
изменить: сделал это как было предложено :)
Мы также могли бы немного пофантазировать и сделать это как метод расширения, чтобы он зависал от класса 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);
}
}
d
не используется. Чтобы использовать этот код, вы можете написать var date = new DateTime(); var millis = date.currentTimeMillis();
Но date
переменная будет просто избыточной, а ее состояние никогда не будет использоваться. Когда не используется состояние объекта, создание метода расширения просто скрывает код. Ответ, предоставленный @Hath, более прямолинейный и, следовательно, лучше (для меня). Может быть, @Joel Coehoorn намеревался использовать значение d
вместо DateTime.UtcNow
тела метода? Я довольно часто использую методы расширения, но не для этого.
Вот простой способ приблизиться к отметке времени Unix. Использование UTC ближе к концепции unix, и вам нужно скрыть от 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);
печатает:
millis=1226674125796
Фреймворк не включает старые секунды (или миллисекунды) с 1970 года. Ближайшее, что вы получите, - это DateTime.Ticks, которое представляет собой количество 100 наносекунд с 1 января 0001 года.
Я просто рассматриваю наиболее простой способ достичь того, к чему вы стремились, а именно:
DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond
DateTime.UtcNow
- лучший вариант
Если вы хотите, чтобы метка времени сравнивалась между разными процессами, разными языками (Java, C, C #), в GNU / Linux и Windows (как минимум семь):
C #:
private static long nanoTime() {
long nano = 10000L * Stopwatch.GetTimestamp();
nano /= TimeSpan.TicksPerMillisecond;
nano *= 100L;
return nano;
}
Ява:
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;
}
Я знаю, что вопрос требует эквивалента, но поскольку я использую эти 2 для тех же задач, что и в GetTickCount . Я могу испытывать ностальгию, но System.currentTimeMillis () и GetTickCount () - единственные, которые я использую для получения тиков.
[DllImport("kernel32.dll")]
static extern uint GetTickCount();
// call
uint ticks = GetTickCount();