ฉันจะแปลง DateTime เป็นจำนวนวินาทีตั้งแต่ปี 1970 ได้อย่างไร


120

ฉันกำลังพยายามแปลงตัวแปร C # DateTime เป็นเวลา Unix นั่นคือจำนวนวินาทีตั้งแต่วันที่ 1 มกราคม 1970 ดูเหมือนว่า DateTime จะถูกนำมาใช้จริงเป็นจำนวน 'เห็บ' ตั้งแต่วันที่ 1 มกราคม 0001

ความคิดปัจจุบันของฉันคือการลบวันที่ 1 มกราคม 1970 จาก DateTime ของฉันดังนี้:

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0));
return span.TotalSeconds;

มีวิธีที่ดีกว่า?


คำตอบ:


196

โดยพื้นฐานแล้ว นี่คือวิธีการที่ฉันใช้ในการแปลงเป็นและออกจากช่วงเวลา Unix:

public static DateTime ConvertFromUnixTimestamp(double timestamp)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    return origin.AddSeconds(timestamp);
}

public static double ConvertToUnixTimestamp(DateTime date)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    TimeSpan diff = date.ToUniversalTime() - origin;
    return Math.Floor(diff.TotalSeconds);
}

ปรับปรุง: ณ สุทธิ 2.1 หลักและมาตรฐานสุทธิ 2.1 DateTime เท่ากับ Unix Epoch DateTime.UnixEpochสามารถได้รับจากไฟฟ้าสถิต


1
ควรสังเกตว่าหากคุณต้องการแปลงเป็นมิลลิวินาทีสำหรับการประทับเวลาที่แม่นยำยิ่งขึ้นหรือความเข้ากันได้ของวัตถุ Javascript Date () คุณต้องใช้ long แทน int สำหรับประเภทการประทับเวลา
Soviut

3
ไม่ได้ผลสำหรับฉัน คำตอบนี้ได้เคล็ดลับ: stackoverflow.com/questions/249760/…
Zeezer

@Jonny - ToUniversalTime () แปลงเป็น UTC ดังนั้นจึงมีบัญชีสำหรับ UTC
Dave Swersky

4
DateTime origin = DateTime ใหม่ (1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); น่าสนใจที่ไม่มีใครแนะนำเรื่องนี้ บ่อยครั้งที่คุณจะมีมิลลิวินาทีแทนเวลา Utc และถ้าคุณt specify this explicitly and somewhere later in code youไม่มี ToUniversalTime () มากกว่าที่คุณจะจบลงด้วยเวลา Utc ที่ไม่ดีเพราะโดยค่าเริ่มต้น DateTime ไม่ใช่ Utc
steavy

52

หากระบบที่เหลือของคุณตกลงกับ DateTimeOffset แทน DateTime มีคุณสมบัติที่สะดวกมาก:

long unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds();

7
นี่เป็นวิธีที่สะอาดกว่า แต่ใช้ได้เฉพาะในกรอบ 4.6 msdn.microsoft.com/en-us/library/…
Oscar Fraxedas

1
ดี และแน่นอนว่าสำหรับการเปลี่ยนจาก unix เป็น DateTimeOffset คุณสามารถใช้var time = DateTimeOffset.FromUnixTimeSeconds(5000); MS Doc
Jordan

22

สิ่งเดียวที่ฉันเห็นคือมันควรจะเป็นตั้งแต่เที่ยงคืน 1 มกราคม 1970 UTC

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc));
return span.TotalSeconds;

7
ควรเป็น DateTime.UtcNow หรือไม่?
oferei

14

คุณอาจต้องการใช้ DateTime.UtcNow เพื่อหลีกเลี่ยงปัญหาเขตเวลา

TimeSpan span= DateTime.UtcNow.Subtract(new DateTime(1970,1,1,0,0,0)); 

วิธีเดียวที่จะหลีกเลี่ยงปัญหาเขตเวลาคือ 1) ยังคงเพิกเฉยอย่างมีความสุขและสนับสนุนเพียงเขตเวลาเดียวหรือ 2) จัดการเขตเวลา (อย่างน้อย) ทุกที่ที่คุณเชื่อมต่อกับระบบอื่นหรือผู้ใช้ปลายทาง โดยเฉพาะอย่างยิ่งการใช้ UTC ทุกที่ภายในเป็นเพียงส่วนหนึ่งของการต่อสู้เท่านั้น ในสถานการณ์แรกการเพิ่มวันเวลา UTC ทำให้ปัญหาแย่ลงจริง ๆ จนกว่าคุณจะพร้อมที่จะทำทั้งหมด (2) เนื่องจากคุณเปลี่ยนจากการสนับสนุนเขตเวลาใดเขตหนึ่งเป็นการสนับสนุนเฉพาะ UTC
jpaugh

1

วิธีนี้จะดีถ้าวันที่ - เวลาที่เป็นปัญหาเป็น UTC หรือแสดงเวลาท้องถิ่นในพื้นที่ที่ไม่เคยสังเกตเวลาออมแสง กิจวัตรความแตกต่างของวันที่และเวลาไม่คำนึงถึงเวลาออมแสงดังนั้นจะถือว่าเที่ยงคืนวันที่ 1 มิถุนายนเป็นผลคูณของ 24 ชั่วโมงหลังเที่ยงคืนวันที่ 1 มกราคมฉันไม่รู้อะไรใน Windows ที่รายงานกฎการออมแสงในอดีตสำหรับปัจจุบัน สถานที่ดังนั้นฉันไม่คิดว่าจะมีวิธีใดที่ดีในการจัดการอย่างถูกต้องตลอดเวลาก่อนการเปลี่ยนแปลงกฎการออมแสงล่าสุด



0

ฉันใช้ปี 2000 แทน Epoch Time ในแคลคูลัสของฉัน การทำงานกับตัวเลขที่น้อยกว่านั้นง่ายต่อการจัดเก็บและขนส่งและเป็นมิตรกับ JSON

ปี 2000 อยู่ที่ 946684800 วินาทีของเวลา

ปี 2543 อยู่ที่ 63082281600 ที่สองนับจากวันที่ 1 มกราคม 0001

DateTime.UtcNow Ticks เริ่มตั้งแต่วันที่ 1 ม.ค. 0001

วินาทีจากปี 2000 :

DateTime.UtcNow.Ticks/10000000-63082281600

วินาทีจากเวลา Unix:

DateTime.UtcNow.Ticks/10000000-946684800

ตัวอย่างเช่นปี 2020 ได้แก่ :

var year2020 = (DateTime ใหม่ ()). AddYears (2019) .Ticks; // เพราะ DateTime เริ่มตอนปี 1 แล้ว

637134336000000000 เห็บตั้งแต่วันที่ 1 ม.ค. 0001

63713433600 วินาทีนับตั้งแต่วันที่ 1 มกราคม 0001

1577836800 วินาทีนับตั้งแต่ยุค

631152000วินาทีตั้งแต่ปี 2000

อ้างอิง:

ตัวแปลงเวลายุค: https://www.epochconverter.com

ตัวแปลงปี 1: https://www.epochconverter.com/seconds-days-since-y0

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