อะไรคือสิ่งที่เทียบเท่ากับ Java System.currentTimeMillis()
ใน C #?
อะไรคือสิ่งที่เทียบเท่ากับ 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
ส่งกลับ ms ตั้งแต่แอปเริ่มต้น System.currentTimeMillis()
เป็นสิ่งที่ดีสำหรับการตรวจสอบเวลาที่ผ่านไป System.nanoTime()
แต่ถ้าคุณต้องการที่สองระยะเวลาที่จะเทียบเคียงคุณต้องใช้
หากคุณสนใจ TIMING ให้เพิ่มข้อมูลอ้างอิงไปที่ System.Diagnostics และใช้นาฬิกาจับเวลา
ตัวอย่างเช่น:
var sw = Stopwatch.StartNew();
...
var elapsedStage1 = sw.ElapsedMilliseconds;
...
var elapsedStage2 = sw.ElapsedMilliseconds;
...
sw.Stop();
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
DateTimeOffset
วิธีการดังกล่าวถูกนำมาใช้เมื่อ. Net 4.6
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 ตามที่แนะนำ :)
นอกจากนี้เรายังสามารถจินตนาการได้เล็กน้อยและทำเป็นวิธีการขยายเพื่อให้แฮงค์ปิดคลาส 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 เป็นผู้ใกล้ชิดกับแนวคิดยูนิกซ์และคุณจำเป็นต้องแอบแฝงจากการ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 (อย่างน้อยเจ็ด):
ค#:
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;
}