以毫秒精度获取 DateTime.Now

Get DateTime.Now with milliseconds precision

提问人:LuckyHK 提问时间:4/16/2013 最后编辑:Peter MortensenLuckyHK 更新时间:4/8/2021 访问量:557501

问:

如何以毫秒级精度精确构造实际时间的时间戳?

我需要像 16.4.2013 9:48:00:123 这样的东西。这可能吗?我有一个应用程序,我每秒对值进行采样 10 次,我需要在图表中显示它们。

C# 日期时间 精度 毫秒

评论

0赞 Soner Gönül 4/16/2013
相关 msdn.microsoft.com/en-us/library/bb882581.aspx
0赞 wentz 3/8/2019
请注意,许多答案的使用时间长达数小时(标准时间)。在时间戳的情况下(以及在许多其他情况下),这可能应该与 (am/pm) 配对或替换为 (military time)。hhttHH

答:

142赞 Pyromancer 4/16/2013 #1

这应该有效:

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

如果您不需要显示它,只需要知道时差,请不要将其转换为 String。就这样吧,DateTime.Now();

并用来知道时间间隔之间的差异:TimeSpan

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'));

评论

0赞 LuckyHK 4/16/2013
我需要用它进行计算,所以我无法将其转换为字符串。
0赞 Nae 6/30/2021
请注意,亚秒的最高精度显然是 7,如 中所示。"hh.mm.ss.fffffff"
379赞 Jon Skeet 4/16/2013 #2

如何以毫秒级精度精确构造实际时间的时间戳?

我怀疑你的意思是毫秒级的精度。 精度很高,但在精度方面相当粗糙。一般来说,你不能。通常,系统时钟(从中获取数据)的分辨率约为 10-15 毫秒。有关更多详细信息,请参阅 Eric Lippert 关于精度和准确性的博客文章DateTimeDateTime.Now

如果您需要比这更准确的计时,您可能需要考虑使用 NTP 客户端。

但是,目前尚不清楚您在这里是否真的需要毫秒级精度。如果您不关心确切的时序 - 您只想以正确的顺序显示样本,并且具有“相当不错”的精度,那么系统时钟应该没问题。我建议您使用而不是避免夏令时过渡等时区问题。DateTime.UtcNowDateTime.Now

如果您的问题实际上只是将 a 转换为具有毫秒精度的字符串,我建议使用:DateTime

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

(请注意,与您的示例不同,这是可排序的,不太可能引起混淆它是“月/日/年”还是“日/月/年”。

评论

6赞 Jon Skeet 2/1/2018
@antonio:除了“不起作用”之外,没有更多的信息,我无法提供更多的帮助。
0赞 antonio 2/5/2018
是的,我可以提供更多信息:“{0:yyyyMMdd HH:mm:ss.fff}”, DateTime.UtcNow -> 20180502 11:07:20.000 Win32.GetSystemTime(ref stime) -> 2018,2,5,11,7,20,0 (y m d h mm ss ms) 我可以创建一个毫秒的日期时间实例: var dt = new DateTime(2018, 5, 2, 19, 34, 55, 200);“{0:yyyyMMdd HH:mm:ss.fff}”,dt -> 20180502 19:34:55.200 .Net Compact 框架,Windows Embedded Compact 7,在 ARM Cortex-A8 上
0赞 Jon Skeet 2/5/2018
@antonio:所以听起来你在使用的硬件上使用的 .NET 版本根本无法提供亚秒级的精度 - 或者你碰巧在第二个边界上调用它。(如果你一直反复点击,它每秒只增加一次吗?你还没有表现出来。DateTime.UtcNow
0赞 antonio 2/5/2018
当我从 DateTime.Now 检索 Ticks 时,该值被截断:Ticks 636534596580000000 DateTime from Ticks 20180205 20:34:18.000。我认为限制在于硬件/软件。我使用了秒表类,而不是谢谢乔恩
1赞 Jon Skeet 9/5/2020
@kuldeep:恐怕如果你问了足够糟糕的问题,以至于被禁止提问,我不会试图通过评论进入另一个问题来绕过这个问题。我建议你编辑你的旧问题变得更好,尝试取消禁令。
17赞 Renae 11/29/2013 #3

火焰术士的回答对我来说似乎很好,但也许你想要:

DateTime.Now.Millisecond

但是,如果您正在比较日期,TimeSpan 是要走的路。

评论

19赞 Contango 9/12/2014
注意:如果要将两个 DateTime 之间的差异作为 TimeSpan 进行比较,则需要 .Milliseconds 保存当前 Milliseconds 计数器,该计数器永远不会大于 1000,而 TotalMilliseconds 保存自纪元以来经过的总毫秒数。TotalMilliseconds
-3赞 amol jadhao 4/1/2014 #4

DateTime.Now.ToString(“ddMMyyyyhhmmssffff”)

3赞 Roland Dietz 7/26/2016 #5

据我了解,你可以选择:

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

这将切断小于 1 毫秒的刻度。

评论

0赞 Peter Mortensen 12/15/2016
是的,但 DateTime.Now 的实际分辨率可能不超过大约 16 毫秒。
29赞 Jozcar 1/6/2017 #6

我一直在寻找类似的解决方案,根据此线程上的建议,我使用以下内容,它就像魅力一样工作。注意:这是您希望捕获的精度数字。DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff").fff

评论

1赞 Jaider 8/12/2017
如果日期在下午(下午 4 点),将显示为早上。修复:使用(军事时间)或添加(PM 或 AM)。如以下示例所示:repl.it/KGr3/1HHtt
-2赞 distiking 8/4/2017 #7
public long millis() {
  return (long.MaxValue + DateTime.Now.ToBinary()) / 10000;
}

如果需要微秒,只需更改为 ,如果想要微秒的第 10 个,请删除 .1000010/ 10000

22赞 Jacman 2/1/2018 #8

使用带有毫秒的 DateTime 结构,格式如下:

string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", 
CultureInfo.InvariantCulture);
timestamp = timestamp.Replace("-", ".");
6赞 birch 2/17/2018 #9

如果您仍然想要一个日期而不是像其他答案那样的字符串,只需添加此扩展方法即可。

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);
}
2赞 Stochastically 5/1/2018 #10

和的问题在于,根据计算机和操作系统的不同,它可能只能精确到 10 到 15 毫秒之间。但是,在 Windows 计算机上,可以使用低级函数 GetSystemTimePreciseAsFileTime 来获取微秒级精度,请参阅下面的函数。DateTime.UtcNowDateTime.NowGetTimeStamp()

    [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赞 Muhammet Göktürk Ayan 8/28/2018
非常感谢。我一直在寻找这个。它是否会导致任何性能问题,使用生产代码是否安全?
0赞 darkstar 12/3/2018 #11

尝试使用 datetime.now.ticks。这提供了纳秒级精度。取两个刻度 (stoptick - starttick)/10,000 的增量是指定间隔的毫秒。

https://learn.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=netframework-4.7.2

3赞 Ondrej Tucny 4/8/2021 #12

另一种选择是从源值构造一个新实例:DateTimeDateTime

// current date and time
var now = DateTime.Now;

// modified date and time with millisecond accuracy
var msec = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, now.Millisecond, now.Kind);

无需进行任何 to-string 和 from-string 转换,而且它也是非常易于理解和可读的代码。