Câu hỏi Nhận DateTime.Now với độ chính xác mili giây


Làm thế nào tôi có thể xây dựng chính xác một dấu thời gian của thời gian thực tế với độ chính xác mili giây?

Tôi cần một cái gì đó như 16.4.2013 9: 48: 00: 123. Điều này có thể không? Tôi có một ứng dụng, nơi tôi lấy mẫu giá trị 10 lần mỗi giây và tôi cần hiển thị chúng trong biểu đồ.


167
2018-04-16 08:41


gốc


Liên quan msdn.microsoft.com/en-us/library/bb882581.aspx - Soner Gönül


Các câu trả lời:


Làm thế nào tôi có thể xây dựng chính xác một dấu thời gian của thời gian thực tế với độ chính xác mili giây?

Tôi nghi ngờ bạn có nghĩa là mili giây độ chính xác. DateTime có độ chính xác cao nhưng khá thô về tính chính xác. Nói chung, bạn không thể. Thông thường đồng hồ hệ thống (đó là nơi DateTime.Now lấy dữ liệu của nó từ) có độ phân giải khoảng 10-15 ms. Xem Eric Lippert's bài đăng trên blog về độ chính xác và độ chính xác để biết thêm chi tiết.

Nếu bạn cần thời gian chính xác hơn điều này, bạn có thể muốn xem xét sử dụng ứng dụng khách NTP.

Tuy nhiên, nó không rõ ràng rằng bạn thực sự cần độ chính xác millisecond ở đây. Nếu bạn không quan tâm đến chính xác thời gian - bạn chỉ muốn hiển thị các mẫu theo đúng thứ tự, với độ chính xác "khá tốt", thì đồng hồ hệ thống sẽ ổn. Tôi khuyên bạn nên sử dụng DateTime.UtcNow thay vì DateTime.Now tuy nhiên, để tránh các vấn đề múi giờ xung quanh quá trình chuyển đổi tiết kiệm ánh sáng ban ngày, v.v.

Nếu câu hỏi của bạn là thực ra chỉ quanh việc chuyển đổi DateTime đến một chuỗi có độ chính xác mili giây, tôi khuyên bạn nên sử dụng:

string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff",
                                            CultureInfo.InvariantCulture);

(Lưu ý rằng không giống như mẫu của bạn, điều này có thể sắp xếp và ít có khả năng gây nhầm lẫn xung quanh việc đó có phải là "tháng / ngày / năm" hay "ngày / tháng / năm").


241
2018-04-16 08:45



không hoạt động cho khung nhỏ gọn 3.5 - antonio
@antonio: Không có nhiều thông tin hơn "không hoạt động", tôi không thể cung cấp thêm trợ giúp nào. - Jon Skeet
Có, tôi có thể cung cấp thêm thông tin: "{0: yyyyMMdd HH: mm: ss.fff}", DateTime.UtcNow -> 20180502 11: 07: 20.000 Win32.GetSystemTime (ref stime) -> 2018,2,5,11 , 7,20,0 (ymdh mm ss ms) Tôi có thể tạo một phiên bản thời gian ngày bằng mili giây: var dt = new DateTime (2018, 5, 2, 19, 34, 55, 200); "{0: yyyyMMdd HH: mm: ss.fff}", dt -> 20180502 19: 34: 55.200 .Net framework gọn nhẹ, Windows Embedded Compact 7, trên ARM Cortex-A8 - antonio
@antonio: Vì vậy, có vẻ như phiên bản .NET bạn đang sử dụng trên phần cứng bạn đang sử dụng chỉ đơn giản là không cung cấp độ chính xác phụ - hoặc bạn tình cờ gọi nó trên ranh giới thứ hai. (Nếu bạn tiếp tục đánh DateTime.UtcNow nhiều lần, nó chỉ từng tăng một lần mỗi giây? Bạn chưa thể hiện điều đó.) - Jon Skeet
Khi tôi lấy Ticks từ DateTime.Now, giá trị sẽ bị cắt ngắn: Ticks 636534596580000000 Ngày giờ từ Ticks 20180205 20: 34: 18.000. giới hạn là trong phần cứng / phần mềm, tôi nghĩ vậy. Tôi đã sử dụng lớp Đồng hồ bấm giờ, thay vào đó là Cảm ơn Jon - antonio


Điều này sẽ hoạt động:

DateTime.Now.ToString("hh.mm.ss.ffffff");

Nếu bạn không cần nó được hiển thị và chỉ cần biết sự khác biệt thời gian, cũng không chuyển đổi nó thành một String. Cứ để nó như, DateTime.Now();

Và sử dụng TimeSpan để biết sự khác biệt giữa các khoảng thời gian:

Thí dụ

DateTime start;
TimeSpan time;

start = DateTime.Now;

//Do something here

time = DateTime.Now - start;
label1.Text = String.Format("{0}.{1}", time.Seconds, time.Milliseconds.ToString().PadLeft(3, '0'));

95
2018-04-16 08:45



Tôi cần tính toán với nó, vì vậy tôi không thể chuyển đổi nó thành chuỗi. - LuckyHK
xem phiên bản đã chỉnh sửa nếu đây là những gì bạn cần - Pyromancer


Tôi đã tìm kiếm một giải pháp tương tự, dựa trên những gì đã được đề xuất trên chủ đề này, tôi sử dụng những điều sau đây      DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff")  và nó hoạt động như sự quyến rũ. Lưu ý: rằng .fff là những con số chính xác mà bạn muốn chụp.


18
2018-01-05 17:22



Nếu ngày là vào buổi chiều (4PM) sẽ hiển thị như vào buổi sáng. SỬA CHỮA: Sử dụng HH (thời gian quân sự) hoặc thêm tt (PM hoặc AM). Như thể hiện trong ví dụ này: repl.it/KGr3/1 - Jaider


Câu trả lời của Pyromancer có vẻ khá tốt với tôi, nhưng có thể bạn muốn:

DateTime.Now.Millisecond

Nhưng nếu bạn đang so sánh ngày, TimeSpan là con đường để đi.


14
2017-11-29 00:15



Lưu ý: Nếu bạn so sánh sự khác biệt giữa hai DateTimes với tư cách là một TimeSpan, bạn cần TotalMilliseconds. Mili giây giữ bộ đếm Mili giây hiện tại, không bao giờ lớn hơn 1000, trong khi TotalMilliseconds giữ tổng số mili giây trôi qua kể từ kỷ nguyên. - Contango


Sử dụng cấu trúc DateTime với mili giây và định dạng như sau:

string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", 
CultureInfo.InvariantCulture);
timestamp = timestamp.Replace("-", ".");

4
2018-01-31 19:23





Theo như tôi hiểu được câu hỏi, bạn có thể đi:

DateTime dateTime = DateTime.Now;
DateTime dateTimeInMilliseconds = dateTime.AddTicks(-1 * dateTime.Ticks % 10000); 

Điều này sẽ cắt bỏ bọ ve nhỏ hơn 1 mili giây.


3
2017-07-25 16:39



Có, nhưng độ phân giải thực tế của DateTime.Now có thể không quá 16 ms. - Peter Mortensen


Nếu bạn vẫn muốn một ngày thay vì một chuỗi giống như các câu trả lời khác, chỉ cần thêm phương thức mở rộng này.

public static DateTime ToMillisecondPrecision(this DateTime d) {
    return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute,
                        d.Second, d.Millisecond, d.Kind);
}

3
2018-02-16 20:16





public long millis() {
  return (long.MaxValue + DateTime.Now.ToBinary()) / 10000;
}

Nếu bạn muốn micro giây, chỉ cần thay đổi 10000 đến 10và nếu bạn muốn vi phạm lần thứ 10, hãy xóa / 10000.


0
2017-08-04 13:00





Rắc rối với DateTime.UtcNow và DateTime.Now là, tùy thuộc vào máy tính và hệ điều hành, nó có thể chỉ chính xác trong khoảng từ 10 đến 15 mili giây. Tuy nhiên, trên các cửa sổ máy tính người ta có thể sử dụng bằng cách sử dụng chức năng cấp thấp GetSystemTimePreciseAsFileTime để có được độ chính xác micro giây, hãy xem hàm GetTimeStamp() phía dưới.

    [System.Security.SuppressUnmanagedCodeSecurity, System.Runtime.InteropServices.DllImport("kernel32.dll")]
    static extern void GetSystemTimePreciseAsFileTime(out FileTime pFileTime);

    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct FileTime  {
        public const long FILETIME_TO_DATETIMETICKS = 504911232000000000;   // 146097 = days in 400 year Gregorian calendar cycle. 504911232000000000 = 4 * 146097 * 86400 * 1E7
        public uint TimeLow;    // least significant digits
        public uint TimeHigh;   // most sifnificant digits
        public long TimeStamp_FileTimeTicks { get { return TimeHigh * 4294967296 + TimeLow; } }     // ticks since 1-Jan-1601 (1 tick = 100 nanosecs). 4294967296 = 2^32
        public DateTime dateTime { get { return new DateTime(TimeStamp_FileTimeTicks + FILETIME_TO_DATETIMETICKS); } }
    }

    public static DateTime GetTimeStamp() { 
        FileTime ft; GetSystemTimePreciseAsFileTime(out ft);
        return ft.dateTime;
    }

0
2018-04-30 16:25