How can I exactly construct a time stamp of actual time with milliseconds precision?
I need something like 16.4.2013 9:48:00:123. Is this possible? I have an application, where I sample values 10 times per second, and I need to show them in a graph.
How can I exactly construct a time stamp of actual time with milliseconds precision?
I suspect you mean millisecond accuracy. DateTime
has a lot of precision, but is fairly coarse in terms of accuracy. Generally speaking, you can't. Usually the system clock (which is where DateTime.Now
gets its data from) has a resolution of around 10-15 ms. See Eric Lippert's blog post about precision and accuracy for more details.
If you need more accurate timing than this, you may want to look into using an NTP client.
However, it's not clear that you really need millisecond accuracy here. If you don't care about the exact timing - you just want to show the samples in the right order, with "pretty good" accuracy, then the system clock should be fine. I'd advise you to use DateTime.UtcNow
rather than DateTime.Now
though, to avoid time zone issues around daylight saving transitions, etc.
If your question is actually just around converting a DateTime
to a string with millisecond precision, I'd suggest using:
string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff",
CultureInfo.InvariantCulture);
(Note that unlike your sample, this is sortable and less likely to cause confusion around whether it's meant to be "month/day/year" or "day/month/year".)
This should work:
DateTime.Now.ToString("hh.mm.ss.ffffff");
If you don't need it to be displayed and just need to know the time difference, well don't convert it to a String. Just leave it as, DateTime.Now();
And use TimeSpan
to know the difference between time intervals:
Example
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'));
I was looking for a similar solution, base on what was suggested on this thread, I use the following
DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff")
, and it work like charm. Note: that .fff
are the precision numbers that you wish to capture.
Pyromancer's answer seems pretty good to me, but maybe you wanted:
DateTime.Now.Millisecond
But if you are comparing dates, TimeSpan is the way to go.
Use DateTime Structure with milliseconds and format like this:
string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff",
CultureInfo.InvariantCulture);
timestamp = timestamp.Replace("-", ".");
As far as I understand the question, you can go for:
DateTime dateTime = DateTime.Now;
DateTime dateTimeInMilliseconds = dateTime.AddTicks(-1 * dateTime.Ticks % 10000);
This will cut off ticks smaller than 1 millisecond.
If you still want a date instead of a string like the other answers, just add this extension method.
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);
}
The trouble with DateTime.UtcNow
and DateTime.Now
is that, depending on the computer and operating system, it may only be accurate to between 10 and 15 milliseconds. However, on windows computers one can use by using the low level function GetSystemTimePreciseAsFileTime to get microsecond accuracy, see the function GetTimeStamp()
below.
[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;
}
try using datetime.now.ticks. this provides nanosecond precision. taking the delta of two ticks (stoptick - starttick)/10,000 is the millisecond of specified interval.
https://docs.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=netframework-4.7.2
public long millis() {
return (long.MaxValue + DateTime.Now.ToBinary()) / 10000;
}
If you want microseconds, just change 10000
to 10
, and if you want the 10th of micro, delete / 10000
.
DateTime.Now.ToString("ddMMyyyyhhmmssffff")
来源:https://stackoverflow.com/questions/16032451/get-datetime-now-with-milliseconds-precision