Що є еквівалентом 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;
}
редагувати: зробив це utc, як запропоновано :)
Ми також можемо трохи пофантазувати і зробити це як метод розширення, щоб він завис від класу 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:
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();