2008-11-14 60 views

Trả lời

3

Khung không bao gồm giây cũ (hoặc mili giây) từ năm 1970. Gần nhất bạn nhận được là DateTime.Ticks đó là số 100 nano giây kể từ ngày 1 tháng 1 0001.

+1

(DateTime.Ticks/10000000) - (số giây giữa 0001 và 1970) có trả lời chính xác không? – Liam

85

Một thay thế:

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; 
} 
6

các System.currentTimeMillis() trong java trả về thời gian hiện tại trong mili giây từ 1/1/1970

C# đó sẽ là

public static double GetCurrentMilli() 
    { 
     DateTime Jan1970 = new DateTime(1970, 1, 1, 0, 0,0,DateTimeKind.Utc); 
     TimeSpan javaSpan = DateTime.UtcNow - Jan1970; 
     return javaSpan.TotalMilliseconds; 
    } 

chỉnh sửa: thực hiện như đã đề xuất :)

+3

DateTime.Now sử dụng giờ địa phương, không sử dụng UTC. Tôi không biết chính xác những gì sẽ xảy ra khi bạn trừ một loại DateTime không xác định từ một địa phương, nhưng tốt nhất là đặt cả hai thành UTC :) –

4

Đây là cách đơn giản để ước tính dấu thời gian Unix. Sử dụng UTC gần với khái niệm unix và bạn cần phải bí mật từ double đến 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); 

in:

millis=1226674125796 
+0

chính xác những gì tôi cần. – Ajibola

8

Chúng tôi cũng có thể nhận được một chút lạ mắt và làm điều đó như một phương pháp mở rộng, do đó nó được treo ra khỏi lớp 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); 
    } 
} 
+0

Hỗn hợp thú vị của các ngôn ngữ bạn đã có;) –

+0

Lol! Tôi làm điều đó đôi khi: phải chuyển đổi qua lại giữa hai rất nhiều, nhưng thông thường nó trong IDE vì vậy tôi có phản hồi ngay lập tức về nó. –

+2

Đây có phải là một chút sai? Phương thức mở rộng này sẽ chuyển sang bất kỳ * instance * nào của DateTime, nhưng nó không sử dụng cá thể. Chỉ có vẻ khó hiểu ... Tôi không nghĩ rằng bạn nên yêu cầu một tham số mà bạn không sử dụng – mortb

61

Một thành ngữ phổ biến trong Java là sử dụng currentTimeMillis() cho mục đích thời gian hoặc lập lịch, nơi bạn không quan tâm đến mili giây thực sự kể từ năm 1970, nhưng thay vào đó tính toán một số giá trị tương đối và so sánh sau đó invocat các ion của currentTimeMillis() đến giá trị đó.

Nếu đó là những gì bạn đang tìm kiếm, tương đương C# là Environment.TickCount.

+1

Nhưng cả hai đều cho số khác biệt. Làm thế nào họ so sánh chính xác ?? 'C# cung cấp: 2688547' và' Java cung cấp: 1390707872687' – Elshan

+0

@Elshan Bạn không thể so sánh chúng. Chúng khác nhau. Kỹ thuật này là dành cho thời gian và lập kế hoạch trong một ứng dụng, không phải trên các ứng dụng. – Barend

+0

'System.currentTimeMillis()' trả về thời gian UTC tính bằng ms kể từ năm 1970, trong khi 'Environment.TickCount' trả về ms kể từ khi ứng dụng bắt đầu. 'System.currentTimeMillis()' là tốt để kiểm tra thời gian trôi qua, nhưng nếu bạn muốn hai thời gian để so sánh, bạn phải sử dụng 'System.nanoTime()'. – michelpm

8

Nếu bạn quan tâm đến TIMING, hãy thêm tham chiếu đến System.Diagnostics và sử dụng Đồng hồ bấm giờ.

Ví dụ:

var sw = Stopwatch.StartNew(); 
... 
var elapsedStage1 = sw.ElapsedMilliseconds; 
... 
var elapsedStage2 = sw.ElapsedMilliseconds; 
... 
sw.Stop(); 
1

Tôi biết câu hỏi yêu cầu tương đương nhưng kể từ khi tôi sử dụng những 2 cho các nhiệm vụ cùng tôi ném vào GetTickCount. Tôi có thể hoài cổ nhưng System.currentTimeMillis() và GetTickCount() là những người duy nhất tôi sử dụng để nhận bọ ve.

[DllImport("kernel32.dll")] 
static extern uint GetTickCount(); 

// call 
uint ticks = GetTickCount(); 
3

tôi chỉ xem xét thẳng nhất về phía trước cách làm thế nào để đạt được những gì bạn đã và đang phấn đấu cho như sau:

DateTime.Now.Ticks/TimeSpan.TicksPerMillisecond 
+1

'DateTime.UtcNow' là một tùy chọn tốt hơn –

1

Nếu bạn muốn có một dấu thời gian để được so sánh giữa các quá trình khác nhau, ngôn ngữ khác nhau (Java, C, C#), dưới GNU/Linux và Windows (Bảy ít nhất):

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; 
} 
Các vấn đề liên quan