一、介绍
时间戳(Timestamp)是指从某个固定的日期时间点(如:1970年1月1日或1904年1月1日等)到现在的总秒数或毫秒数。在计算机系统中,经常需要对时间进行计算、存储、比较和转换,而时间戳可以方便地实现这些功能。
C#提供了多种获取当前时间戳的方式,这篇文章将综述这些方法及其使用场景。
二、DateTime.Now.Ticks
DateTime.Now.Ticks属性返回自0001年1月1日午夜12:00:00以来的100纳秒间隔数。这个值在整个. NET Framework上是唯一的,并适用于所有日期和时间值。Ticks属性的值介于DateTime.MinValue.Ticks
和DateTime.MaxValue.Ticks
之间,即从0001年1月1日到9999年12月31日的范围内的所有日期和时间。
因为Ticks表示了自0001年1月1日以来的时间间隔,所以要把Ticks转换为秒,需要将其除以10,000,000。为了获得毫秒时间戳,需要将Ticks除以10,000。
long seconds = DateTime.Now.Ticks / TimeSpan.TicksPerSecond; long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
三、DateTime.Now.ToUniversalTime().ToString("yyyyMMddHHmmssfff")
现在日期时间的UTC(协调世界时)表示与当前本地时区的偏差在表示这个时间之前是不必考虑的。直接使用DateTime.Now.ToUniversalTime()方法,将返回一个DateTime值,表示当前日期和时间的UTC时间。将这个时间格式化后,即可得到当前时间的UTC表达方式。
在这个表达中,一共包含了14个数字,前面8个数字代表年月日,接下来6个数字代表时分秒,末尾3个数字表示毫秒。该表达方式用于在分布式系统中唯一地标识一个事件的时间戳。
string utcTimeStamp = DateTime.Now.ToUniversalTime().ToString("yyyyMMddHHmmssfff");
四、DateTimeOffset.UtcNow.ToUnixTimeSeconds()
DateTimeOffset结构体表示一个日期和时间,其相对于协调世界时(UTC)的偏移量。在这个结构中,日期和时间的值是DateTime结构中一样的,但是还包括一个Offset属性,代表与UTC的偏移量。
该方法返回从UTC时间1970年1月1日午夜12:00(也称作UNIX纪元)到现在的总秒数。领域中常用于时间戳操作。
long unixTimeStamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
五、Stopwatch类
Stopwatch类表示执行时间测量,并且可用于诊断和性能测试应用程序。这个类提供了一些方法和属性,其中最重要的就是Elapsed属性,它返回一个TimeSpan
对象,表示从计时器启动后经过的时间。可以通过调用Elapsed.TotalMilliseconds
属性,获得自计时器启动以来经过的毫秒数。
Stopwatch类通常比DateTime.Now方法更加精准,特别是对于需要测量较小代码段执行时间的情况。
Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); // 单位时间代码 stopwatch.Stop(); long milliseconds = stopwatch.ElapsedMilliseconds;
六、小结
通过以上介绍,我们了解了C#中几种获取当前时间戳的方法及特点。在不同的应用场景下,可以选择不同的方法来获得时间戳。DateTime.Now.Ticks属性对于只需要计算不同的时间间隔长度很有用,而DateTime.Now.ToUniversalTime()方法用于生成可分布式系统中唯一的时间标识,DateTimeOffset.UtcNow.ToUnixTimeSeconds()方法则通常用于与其他平台进行时间戳的交互,StopWatch类适用于需要精准控制代码执行时间的情况。