Tương đương với Java System.currentTimeMillis()trong C # là gì?
Câu trả lời:
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;
}
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.
C# give : 2688547vàJava give : 1390707872687
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().
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
DateTimeOffsetPhương pháp đó đã được giới thiệu kể từ .Net 4.6.
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 :)
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);
}
}
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.
Đâ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
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.
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
DateTime.UtcNowlà một lựa chọn tốt hơn
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;
}
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();