Java System.currentTimeMillis () เทียบเท่าใน C #


86

อะไรคือสิ่งที่เทียบเท่ากับ Java System.currentTimeMillis()ใน C #?


แค่อยากรู้ว่าทำไมคุณถึงต้องการมิลลิวินาทีตั้งแต่ปี 1970
Alex B

5
DateTimeOffset.UtcNow ToUnixTimeMilliseconds ()
Ramunas

คำตอบ:


90

ทางเลือก:

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
ผลลัพธ์เดียวกันกับ "DateTimeOffset.UtcNow ToUnixTimeMilliseconds ()"
Ramunas

75

สำนวนทั่วไปใน Java คือการใช้currentTimeMillis()เพื่อจุดประสงค์ในการกำหนดเวลาหรือการตั้งเวลาโดยที่คุณไม่สนใจในมิลลิวินาทีจริงตั้งแต่ปี 1970 แต่ให้คำนวณค่าสัมพัทธ์บางส่วนแทนและเปรียบเทียบการเรียกcurrentTimeMillis()ค่านั้นในภายหลัง

ถ้านั่นคือสิ่งที่คุณกำลังมองหา, C # Environment.TickCountเทียบเท่า


1
แต่ทั้งคู่ให้เลขต่างกันว่าเปรียบเทียบถูกต้องอย่างไร ?? C# give : 2688547และJava give : 1390707872687
Elshan

1
@Elshan คุณเทียบไม่ได้เลย เห็บต่างกัน เทคนิคนี้ใช้สำหรับกำหนดเวลาและกำหนดเวลาภายในแอปพลิเคชันไม่ใช่ข้ามแอปพลิเคชัน
เร็

System.currentTimeMillis()ส่งคืนเวลา UTC เป็นมิลลิวินาทีตั้งแต่ปี 1970 ในขณะที่Environment.TickCountส่งกลับ ms ตั้งแต่แอปเริ่มต้น System.currentTimeMillis()เป็นสิ่งที่ดีสำหรับการตรวจสอบเวลาที่ผ่านไป System.nanoTime()แต่ถ้าคุณต้องการที่สองระยะเวลาที่จะเทียบเคียงคุณต้องใช้
michelpm

12

หากคุณสนใจ TIMING ให้เพิ่มข้อมูลอ้างอิงไปที่ System.Diagnostics และใช้นาฬิกาจับเวลา

ตัวอย่างเช่น:

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


7

System.currentTimeMillis()ใน java ส่งกลับเวลาปัจจุบันในหน่วยมิลลิวินาทีจาก 1970/01/01

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 ตามที่แนะนำ :)


4
DateTime ตอนนี้ใช้เวลาท้องถิ่นไม่ใช่ UTC ฉันไม่รู้ว่าจะเกิดอะไรขึ้นเมื่อคุณลบ DateTime ประเภทที่ไม่รู้จักออกจากรายการในเครื่อง แต่ควรตั้งค่าทั้งสองเป็น UTC :)
Jon Skeet

7

นอกจากนี้เรายังสามารถจินตนาการได้เล็กน้อยและทำเป็นวิธีการขยายเพื่อให้แฮงค์ปิดคลาส 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
นี่ไม่ผิดไปหน่อยเหรอ? วิธีการขยายนี้จะส่งต่อไปยังอินสแตนซ์ใด ๆของ DateTime แต่จะไม่ใช้อินสแตนซ์ ดูเหมือนจะสับสน ... ฉันไม่คิดว่าคุณควรต้องมีพารามิเตอร์ที่คุณไม่ได้ใช้
mortb

1
@mortb นั่นเป็นวิธีการขยาย นั่นคือวิธีที่ได้รับการกำหนดใน C # เพื่อ "เพิ่มวิธีการ" ให้กับคลาสโดยไม่ต้องแก้ไขคลาส คอมไพลเลอร์ตีความเมธอดและสามารถนำไปใช้กับอินสแตนซ์ของพารามิเตอร์ "this" ราวกับว่าเป็นวิธีการอินสแตนซ์ในคลาสนั่นเอง มันทำหน้าที่เหมือนกับวิธีการในคลาสคงที่ แต่คอมไพเลอร์ช่วยให้เขียนไวยากรณ์ทางเลือกที่ง่ายขึ้น
Suncat2000

1
ปัญหาdคือไม่ได้ใช้ค่าของพารามิเตอร์ ในการใช้รหัสนี้คุณสามารถเขียนได้var date = new DateTime(); var millis = date.currentTimeMillis();แต่dateตัวแปรจะซ้ำซ้อนและสถานะไม่เคยใช้ เมื่อไม่ใช้สถานะของวัตถุที่สร้างวิธีการขยายเพียงแค่ปิดบังรหัส คำตอบของ @Hath ตรงไปตรงมามากกว่าจึงดีกว่า (สำหรับฉัน) บางที @Joel Coehoorn ตั้งใจจะใช้ค่าdแทนDateTime.UtcNowในตัวเมธอด? ฉันใช้วิธีการขยายค่อนข้างมาก แต่ไม่ใช่สำหรับสิ่งนี้
มรรคา

ทำไมคุณถึงสร้างส่วนขยายที่ไม่ใช้วันที่? ฉันใช้รหัสนี้และทำให้ฉันไม่สนใจ เวอร์ชันที่ถูกต้องคือ return (long) ((d ToUniversalTime () - Jan1st1970) .TotalMilliseconds);
Mark G

4

นี่คือวิธีง่ายๆในการประมาณเวลาประทับของ Unix ใช้เวลา UTC เป็นผู้ใกล้ชิดกับแนวคิดยูนิกซ์และคุณจำเป็นต้องแอบแฝงจากการdoublelong

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

สิ่งที่ฉันต้องการ
Ajibola

3

กรอบงานไม่รวมวินาทีเก่า (หรือมิลลิวินาที) ตั้งแต่ปี 1970 สิ่งที่ใกล้เคียงที่สุดที่คุณได้รับคือ DateTime.Ticks ซึ่งเป็นจำนวน 100 นาโนวินาทีนับตั้งแต่วันที่ 1 มกราคม 0001


1
(DateTime.Ticks / 10,000000) - (จำนวนวินาทีระหว่าง 0001 ถึง 1970) ให้คำตอบที่ถูกต้องหรือไม่
Liam

3

ฉันแค่พิจารณาวิธีที่ตรงไปตรงมาที่สุดในการบรรลุสิ่งที่คุณมุ่งมั่นดังต่อไปนี้:

DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond

1
DateTime.UtcNowเป็นตัวเลือกที่ดีกว่า
Mehdi Khademloo

2

หากคุณต้องการเปรียบเทียบการประทับเวลาระหว่างกระบวนการต่างๆภาษาที่แตกต่างกัน (Java, C, C #) ภายใต้ GNU / Linux และ Windows (อย่างน้อยเจ็ด):

ค#:

private static long nanoTime() {
   long nano = 10000L * Stopwatch.GetTimestamp();
   nano /= TimeSpan.TicksPerMillisecond;
   nano *= 100L;
   return nano;
}

Java:

java.lang.System.nanoTime();

C GNU / ลินุกซ์:

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

ฉันรู้ว่าคำถามถามเทียบเท่าแต่ตั้งแต่ผมใช้ผู้ที่ 2 สำหรับงานเดียวกันฉันโยนในGetTickCount ฉันอาจจะคิดถึง แต่ System.currentTimeMillis () และ GetTickCount () เป็นคนเดียวที่ฉันใช้เพื่อรับเห็บ

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

// call
uint ticks = GetTickCount();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.