ฟังก์ชันที่สร้างการประทับเวลาใน c #


101

ฉันสงสัยว่ามีวิธีสร้างการประทับเวลาใน c # จากวันที่เวลาหรือไม่ ฉันต้องการค่าความแม่นยำระดับมิลลิวินาทีที่ใช้งานได้ใน Compact Framework ด้วย (บอกว่าเนื่องจาก DateTime ToBinary () ไม่มีอยู่ใน CF)

ปัญหาของฉันคือฉันต้องการเก็บค่านี้ในฐานข้อมูลแบบไม่เชื่อเรื่องพระเจ้าดังนั้นฉันจึงสามารถเรียงลำดับได้ในภายหลังและค้นหาว่าค่าใดมากกว่าค่าอื่นเป็นต้น


2
คำตอบที่ได้รับการยอมรับที่นี่เป็นทางออกที่ดี แต่ถ้าคุณต้องการประทับเวลาจริงลองดูคำถาม / คำตอบนี้: stackoverflow.com/questions/9814060/…
inanutshellus

คำตอบ:


206

ฉันมักจะใช้สิ่งต่อไปนี้:

public static String GetTimestamp(this DateTime value)
{
    return value.ToString("yyyyMMddHHmmssfff");
}

สิ่งนี้จะให้สตริงเช่น 200905211035131468 เนื่องจากสตริงไปจากบิตลำดับสูงสุดของการประทับเวลาไปยังลำดับต่ำสุดการเรียงลำดับสตริงแบบง่ายในการสืบค้น SQL ของคุณสามารถใช้เพื่อเรียงลำดับตามวันที่ได้หากคุณติดค่าในฐานข้อมูล


5
ทำไมคุณถึง 21 เดือนและได้รับเพียง 12? :)
PaulB

2
โทเค็นสำหรับปีควรเป็นตัวพิมพ์เล็กที่นี่: return value ToString ("yyyyMMddHHmmssffff");
Don Cote

1
@RobV คำถามถามถึงความแม่นยำระดับมิลลิวินาทีดังนั้นคุณต้องมี 3 'f ในตอนท้าย 4 'f ของคุณให้ความแม่นยำ 100 microsend
Eugene Beresovsky

2
โปรดทราบว่า Compact Framework จะไม่ถ่ายโอนมิลลิวินาที พวกเขาจะเป็น 0 เสมอคุณต้องแก้ไขโค้ดและเพิ่มสิ่งนี้: int tick = Environment.TickCount% 1000; int ms = (ติ๊ก> = MOffset)? (ติ๊ก - MOffset): (1000 - (MOffset - ติ๊ก)); ms = Math.Min (999, Math.Max ​​(0, ms));
Redwolf

43

ฉันเชื่อว่าคุณสามารถสร้าง datestamp สไตล์ยูนิกซ์ที่แม่นยำเป็นวินาทีโดยใช้สิ่งต่อไปนี้

//Find unix timestamp (seconds since 01/01/1970)
long ticks = DateTime.UtcNow.Ticks - DateTime.Parse("01/01/1970 00:00:00").Ticks;
ticks /= 10000000; //Convert windows ticks to seconds
timestamp = ticks.ToString();

การปรับตัวส่วนช่วยให้คุณสามารถเลือกระดับความแม่นยำได้


19

คุณสามารถใช้คุณสมบัติ DateTime.Ticks ซึ่งจัดเก็บได้ยาวนานและเป็นสากลเพิ่มขึ้นและใช้งานได้บนเฟรมเวิร์กขนาดกะทัดรัดเช่นกัน ตรวจสอบให้แน่ใจว่าไม่ได้ใช้รหัสของคุณหลังจากวันที่ 31 ธันวาคม 9999)


เมื่อคุณพูดว่า "เพิ่มขึ้นเสมอ" - ไม่มีการรับประกันว่าการเรียก DateTime.UtcNow.Ticks สองครั้งจะให้ค่าที่แตกต่างกันหรือไม่? กล่าวอีกนัยหนึ่งคุณยังคงต้องใช้ความระมัดระวังก่อนที่จะใช้เป็นเวลาที่ไม่ซ้ำกัน
Jon Skeet

9
@ Konstantinos: คุณไม่สามารถหลีกเลี่ยงรายการที่ซ้ำกันได้หากคุณใช้การประทับเวลา การประทับเวลาไม่ได้ใช้สำหรับคีย์ที่ไม่ซ้ำกัน แต่สำหรับการทำเครื่องหมายเวลา คุณบอกว่าคุณต้องการความแม่นยำระดับมิลลิวินาทีและเห็บมีความแม่นยำ 100ns สิ่งนี้คือคุณจะมีรายการที่ซ้ำกัน หากคุณไม่ต้องการให้คุณต้องการลำดับที่ไม่ซ้ำกันใน DB ซึ่งน่าเสียดายที่ไม่ใช่ฐานข้อมูลที่ไม่เชื่อเรื่องพระเจ้า
Frans Bouma

3
"เป็นการนับเห็บจริงซึ่งเพิ่มขึ้นเมื่อเวลาผ่านไป" แต่นาฬิกาของระบบสามารถย้อนกลับได้เช่นเมื่อสิ้นสุดเวลาออมแสงหากคุณใช้เวลาท้องถิ่นหรือเนื่องจากนาฬิการะบบถูกปรับ
โจ

1
@ ฟราน: อย่างแน่นอน ฉันแสดงความคิดเห็นเพียงเพราะผู้คนควรคิดถึงผลกระทบของโซลูชันที่พวกเขาเลือก ตัวอย่างเช่นฉันใช้ UTC แทนเวลาท้องถิ่นอย่างน้อยเพื่อขจัดปัญหาของ DST
โจ

1
@konstantinos: อืม ... เอกสารบอกว่ามันมีความแม่นยำ 100ns ดังนั้นมันก็แปลกจริงๆที่มันไม่แม่นยำเท่าที่บันทึกไว้ บางทีมันอาจจะเป็นเฟรมเวิร์กที่กะทัดรัด แต่ก็ไม่ใช่เฟรมเวิร์กที่ไม่มีบั๊ก
Frans Bouma


4

เมื่อคุณต้องการการประทับเวลาเป็นวินาทีคุณสามารถใช้สิ่งต่อไปนี้:

var timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds;

2

หากคุณต้องการการประทับเวลาที่ตรงกับเวลาจริงจริง แต่ต้องการให้ไม่ซ้ำกัน (สำหรับอินสแตนซ์ของแอปพลิเคชันที่กำหนด) คุณสามารถใช้รหัสต่อไปนี้:

public class HiResDateTime
{
   private static long lastTimeStamp = DateTime.UtcNow.Ticks;
   public static long UtcNowTicks
   {
       get
       {
           long orig, newval;
           do
           {
               orig = lastTimeStamp;
               long now = DateTime.UtcNow.Ticks;
               newval = Math.Max(now, orig + 1);
           } while (Interlocked.CompareExchange
                        (ref lastTimeStamp, newval, orig) != orig);

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