【问题标题】:Function that creates a timestamp in c#在 C# 中创建时间戳的函数
【发布时间】:2010-10-27 21:13:05
【问题描述】:

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

我的问题是我想以与数据库无关的方式存储此值,以便稍后按它排序并找出哪个值更大等。

【问题讨论】:

标签: c# timestamp compact-framework database-agnostic time-precision


【解决方案1】:

你也可以使用

Stopwatch.GetTimestamp().ToString();

【讨论】:

    【解决方案2】:

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

    var timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds;
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 为什么你有 21 个月却只得到 12 个月? :)
      • 这里的年份标记应为小写:return value.ToString("yyyyMMddHHmmssffff");
      • @RobV 这个问题要求毫秒精度,所以最后需要 3 'f's。您的 4 'f' 提供 100 微发送精度。
      • 请注意,Compact Framework 不会传输毫秒数。它们将始终为 0。您必须修改代码并添加如下内容: int tick = Environment.TickCount % 1000; int ms = (tick >= MOffset) ? (tick - MOffset) : (1000 - (MOffset - tick)); ms = Math.Min(999, Math.Max(0, ms));
      【解决方案4】:

      如果您想要与实际实时相对应的时间戳但也希望它们是唯一的(对于给定的应用程序实例),您可以使用以下代码:

      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;
             }
         }
      }
      

      【讨论】:

        【解决方案5】:

        我相信您可以使用以下方法创建精确到秒的 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();
        

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 当你说“总是增加”时——不能保证对 DateTime.UtcNow.Ticks 的两次调用会给出不同的值,是吗?换句话说,在将其用作唯一时间戳之前,您仍然需要谨慎。
          • @Konstantinos:如果使用时间戳,就无法避免重复。时间戳不用于唯一键,而是用于标记时间。你说你需要毫秒精度,而 ticks 有 100ns 精度。问题是你会有重复的。如果您不希望在数据库中需要一个唯一的序列,不幸的是这与数据库无关。
          • “这是一个真实的滴答计数,随着时间的推移而增加”。但是系统时钟可以倒退 - 例如如果您使用的是本地时间,或者因为系统时钟已调整,则在夏令时结束时。
          • @Frans:绝对。我之所以发表评论,是因为人们应该考虑他们选择的解决方案的含义。例如,我会使用 UTC 而不是本地时间来至少消除 DST 的问题。
          • @konstantinos: 嗯......文档说它有 100ns 的精度,所以它没有记录的精度确实很奇怪。也许它确实是一个紧凑的框架,它不是一个没有错误的框架
          猜你喜欢
          • 2013-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-05
          • 2011-03-27
          • 2013-09-03
          • 2015-03-06
          相关资源
          最近更新 更多