【问题标题】:Java System.currentTimeMillis() equivalent in C#C# 中的 Java System.currentTimeMillis() 等效项
【发布时间】:2010-09-22 08:36:06
【问题描述】:

C# 中 Java 的 System.currentTimeMillis() 等价于什么?

【问题讨论】:

  • 只是好奇,为什么你需要 1970 年以来的 Millis?
  • DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()

标签: c# java .net datetime


【解决方案1】:
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()

【讨论】:

  • DateTimeOffset 方法是从 .Net 4.6 开始引入的。
【解决方案2】:

如果您想在 GNU/Linux 和 Windows(至少七种)下的不同进程、不同语言(Java、C、C#)之间比较时间戳:

C#:

private static long nanoTime() {
   long nano = 10000L * Stopwatch.GetTimestamp();
   nano /= TimeSpan.TicksPerMillisecond;
   nano *= 100L;
   return nano;
}

Java:

java.lang.System.nanoTime();

C GNU/Linux:

static int64_t hpms_nano() {
   struct timespec t;
   clock_gettime( CLOCK_MONOTONIC, &t );
   int64_t nano = t.tv_sec;
   nano *= 1000;
   nano *= 1000;
   nano *= 1000;
   nano += t.tv_nsec;
   return nano;
}

C 窗口:

static int64_t hpms_nano() {
   static LARGE_INTEGER ticksPerSecond;
   if( ticksPerSecond.QuadPart == 0 ) {
      QueryPerformanceFrequency( &ticksPerSecond );
   }
   LARGE_INTEGER ticks;
   QueryPerformanceCounter( &ticks );
   uint64_t nano = ( 1000*1000*10UL * ticks.QuadPart ) / ticksPerSecond.QuadPart;
   nano *= 100UL;
   return nano;
}

【讨论】:

    【解决方案3】:

    我只是考虑如何实现您一直在努力的目标的最直接方法如下:

    DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond
    

    【讨论】:

    • DateTime.UtcNow 是更好的选择
    【解决方案4】:

    我知道问题要求等效,但由于我将这 2 个用于相同的任务,因此我在 GetTickCount 中提出。我可能很怀旧,但 System.currentTimeMillis() 和 GetTickCount() 是我用来获取刻度的唯一方法。

    [DllImport("kernel32.dll")]
    static extern uint GetTickCount();
    
    // call
    uint ticks = GetTickCount();
    

    【讨论】:

      【解决方案5】:

      如果您对 TIMING 感兴趣,请添加对 System.Diagnostics 的引用并使用秒表。

      例如:

      var sw = Stopwatch.StartNew();
      ...
      var elapsedStage1 = sw.ElapsedMilliseconds;
      ...
      var elapsedStage2 = sw.ElapsedMilliseconds;
      ...
      sw.Stop();
      

      【讨论】:

        【解决方案6】:

        Java 中的一个常见习惯用法是将 currentTimeMillis() 用于计时或调度目的,您对自 1970 年以来的实际毫秒数不感兴趣,而是计算一些相对值并将 currentTimeMillis() 的后续调用与该值进行比较价值。

        如果这就是您要查找的内容,那么 C# 等效项是 Environment.TickCount

        【讨论】:

        • 但他们都给出了不同的数字。他们如何正确比较? C# give : 2688547Java give : 1390707872687
        • @Elshan 你无法比较它们。它们是不同的蜱虫。此技术适用于应用程序内的计时和调度,而不是跨应用程序。
        • System.currentTimeMillis() 返回自 1970 年以来的 UTC 时间(以毫秒为单位),而 Environment.TickCount 返回自应用程序启动以来的毫秒数。 System.currentTimeMillis() 适用于检查经过的时间,但如果您希望两个持续时间具有可比性,则必须使用 System.nanoTime()
        【解决方案7】:

        我们也可以花点心思,把它作为一个扩展方法,让它挂在 DateTime 类之外:

        public static class DateTimeExtensions
        {
            private static DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
            public static long currentTimeMillis(this DateTime d)
            {
                return (long) ((DateTime.UtcNow - Jan1st1970).TotalMilliseconds);
            }
        }
        

        【讨论】:

        • 这不是有点不对劲吗?此扩展方法将传递给 DateTime 的任何 instance,但它不使用该实例。只是看起来令人困惑......我认为你不应该需要一个你不使用的参数
        • @mortb 这是一种扩展方法。这就是它在 C# 中定义为在不修改类的情况下向类“添加方法”的方式。编译器解释该方法并将其应用于“this”参数的实例,就好像它是类本身的实例方法一样。它的功能与静态类上的方法相同,但编译器允许编写更简单的替代语法。
        • 问题是没有使用参数d的值。要使用此代码,您可以编写 var date = new DateTime(); var millis = date.currentTimeMillis();date 变量只是多余的,并且它的状态从未使用过。当不使用创建扩展方法的对象的状态时,只会模糊代码。 @Hath 提供的答案更直接,因此(对我而言)更好。也许@Joel Coehoorn 打算在方法主体中使用值d 而不是DateTime.UtcNow?我经常使用扩展方法,但不是为了这个。
        • 你为什么要创建一个不使用日期的扩展?我使用了这段代码,它让我很着迷。正确的版本是:return (long)((d.ToUniversalTime() - Jan1st1970).TotalMilliseconds);
        【解决方案8】:

        java 中的 System.currentTimeMillis() 返回从 1970 年 1 月 1 日开始的当前时间(以毫秒为单位)

        c# 那将是

        public static double GetCurrentMilli()
            {
                DateTime Jan1970 = new DateTime(1970, 1, 1, 0, 0,0,DateTimeKind.Utc);
                TimeSpan javaSpan = DateTime.UtcNow - Jan1970;
                return javaSpan.TotalMilliseconds;
            }
        

        编辑:按照建议设置为 UTC :)

        【讨论】:

        • DateTime.Now 使用本地时间,而不是 UTC。我不知道当您从本地日期时间中减去未知类型的 DateTime 时会发生什么,但最好将它们都设置为 UTC :)
        【解决方案9】:

        这是一种近似 Unix 时间戳的简单方法。 使用 UTC 更接近于 unix 的概念,需要将double 转换为long

        TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc));
        long millis = (long)ts.TotalMilliseconds;
        Console.WriteLine("millis={0}", millis);
        

        打印:

        millis=1226674125796
        

        【讨论】:

        • 正是我需要的。
        【解决方案10】:

        另一种选择:

        private static readonly DateTime Jan1st1970 = new DateTime
            (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        
        public static long CurrentTimeMillis()
        {
            return (long) (DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
        }
        

        【讨论】:

        • 与“DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()”的结果相同
        【解决方案11】:

        该框架不包括自 1970 年以来的旧秒数(或毫秒)。您得到的最接近的是 DateTime.Ticks,它是自 0001 年 1 月 1 日以来的 100 纳秒数。

        【讨论】:

        • 会 (DateTime.Ticks/10000000)-(0001 到 1970 之间的秒数)给出准确的答案吗?
        猜你喜欢
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-31
        • 2015-10-23
        • 2011-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多