102

我想知道,有没有办法在 c# 中从日期时间创建时间戳?我需要一个毫秒精度值,它也适用于 Compact Framework(说因为 DateTime.ToBinary() 在 CF 中不存在)。

我的问题是我想以与数据库无关的方式存储这个值,这样我可以稍后对其进行排序并找出哪个值更大等等。

4

6 回答 6

207

我总是使用类似以下的东西:

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

这将为您提供一个类似 200905211035131468 的字符串,因为该字符串从时间戳的最高位到最低位 如果您在数据库中粘贴值,则可以使用 SQL 查询中的简单字符串排序来按日期排序

于 2009-05-21T09:37:27.650 回答
44

我相信您可以使用以下方法创建精确到一秒的 unix 样式日期戳

//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();

调整分母可以让您选择您的精度水平

于 2010-06-18T03:08:56.520 回答
20

您可以使用 DateTime.Ticks 属性,它是一个长期且通用的可存储属性,并且始终在紧凑框架上增加和使用。只需确保在 9999 年 12 月 31 日之后不使用您的代码;)

于 2009-05-21T09:32:13.247 回答
6

你也可以使用

Stopwatch.GetTimestamp().ToString();
于 2013-06-30T18:31:46.357 回答
4

当您需要以秒为单位的时间戳时,您可以使用以下内容:

var timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds;
于 2017-03-02T07:31:09.823 回答
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;
       }
   }
}
于 2013-01-16T23:23:01.367 回答