Java System.currentTimeMillis () tương đương trong C #


85

Tương đương với Java System.currentTimeMillis()trong C # là gì?


Chỉ tò mò, tại sao bạn cần mili kể từ năm 1970?
Alex B

5
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()
Ramunas

Câu trả lời:


90

Một giải pháp 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;
}

2
Kết quả tương tự với "DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()"
Ramunas

74

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 trình, nơi bạn không quan tâm đến mili giây thực tế 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 các lệnh gọi sau này currentTimeMillis()với giá trị đó.

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


1
Nhưng cả hai đều đưa ra những con số khác biệt. Làm thế nào họ so sánh chính xác ?? C# give : 2688547Java give : 1390707872687
Elshan

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

System.currentTimeMillis()trả về thời gian UTC tính bằng mili giây kể từ năm 1970, trong khi Environment.TickCounttrả về mili giây kể từ khi ứng dụng bắt đầu. System.currentTimeMillis()rất tốt để kiểm tra thời gian đã trôi qua, nhưng nếu bạn muốn hai khoảng thời gian có thể so sánh được thì bạn phải sử dụng System.nanoTime().
michelpm

12

Nếu bạn quan tâm đến TIMING, hãy thêm tham chiếu vào 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();

8
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()

DateTimeOffsetPhương pháp đó đã được giới thiệu kể từ .Net 4.6.
Suncat2000

7

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

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: làm cho nó utc như được đề xuất :)


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

7

Chúng tôi cũng có thể có một chút ưa thích và làm nó như một phương thức mở rộng, để nó treo 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);
    }
}

3
Đây không phải là một chút sai lầm? Phương thức mở rộng này sẽ chuyển giao cho bất kỳ phiên bản DateTime nào, nhưng nó không sử dụng phiên bản này. Chỉ cần 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

1
@mortb Đó là một phương thức mở rộng. Đó là cách nó được định nghĩa trong C # để "thêm một phương thức" vào một lớp mà không cần sửa đổi lớp đó. Trình biên dịch thông dịch phương thức và có thể áp dụng nó cho một thể hiện của tham số "this" như thể nó là một phương thức thể hiện trên chính lớp đó. Nó hoạt động giống như một phương thức trên lớp tĩnh nhưng trình biên dịch cho phép viết một cú pháp thay thế, dễ dàng hơn.
Suncat2000

1
Vấn đề là giá trị của tham số dkhông được sử dụng. Để sử dụng mã này, bạn có thể viết var date = new DateTime(); var millis = date.currentTimeMillis();Nhưng datebiến sẽ dư thừa và trạng thái của nó không bao giờ được sử dụng. Khi không sử dụng trạng thái của đối tượng tạo ra một phương thức mở rộng chỉ làm mờ mã. Câu trả lời được cung cấp bởi @Hath dễ hiểu hơn và do đó tốt hơn (đối với tôi). Có thể @Joel Coehoorn dự định sử dụng giá trị dthay vì DateTime.UtcNowtrong thân phương thức? Tôi sử dụng các phương pháp mở rộng khá nhiều, nhưng không phải cho điều này.
mortb

Tại sao bạn lại tạo một tiện ích mở rộng không sử dụng ngày tháng? Tôi đã sử dụng mã này và nó đã bắt tôi ra ngoài. Phiên bản đúng là: return (long) ((d.ToUniversalTime () - Jan1st1970) .TotalMilliseconds);
Đánh dấu G

4

Đây là một cách đơn giản để ước tính dấu thời gian Unix. Sử dụng UTC là gần gũi hơ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);

bản in:

millis=1226674125796

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

3

Khuôn khổ không bao gồm giây cũ (hoặc mili giây) kể 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/1/1000.


1
(DateTime.Ticks / 10000000) - (số giây từ 0001 đến 1970) có đưa ra câu trả lời chính xác không?
Liam

3

Tôi chỉ xem xét cách đơn giản nhất để đạt được những gì bạn đã phấn đấu như sau:

DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond

1
DateTime.UtcNowlà một lựa chọn tốt hơn
Mehdi Khademloo

2

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

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

1

Tôi biết câu hỏi yêu cầu tương đương nhưng vì tôi sử dụng 2 câu hỏi đó cho các tác vụ giống nhau nên tôi ném vào GetTickCount . Tôi có thể hoài cổ nhưng System.currentTimeMillis () và GetTickCount () là những thứ duy nhất tôi sử dụng để lấy ve.

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

// call
uint ticks = GetTickCount();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.