C#中的Java System.currentTimeMillis()等效项


85

相当于Java的 System.currentTimeMillis()C#中于什么?


很好奇,为什么自1970年以来需要使用千分表?
Alex B

5
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
Ramunas

Answers:


90

替代:

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

2
与“ DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()”相同的结果
Ramunas,

74

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

如果您要寻找的是C#,则为Environment.TickCount


1
但是他们都给出了不同的数字,他们如何正确比较?C# give : 2688547Java give : 1390707872687
Elshan 2014年

1
@Elshan您无法比较它们。他们是不同的s。此技术用于在应用程序内而不是跨应用程序进行计时和调度。
Barend 2014年

System.currentTimeMillis()自1970年以来返回以毫秒为单位的UTC时间,而Environment.TickCount自应用启动以来返回的毫秒数。System.currentTimeMillis()可以很好地检查经过时间,但是如果您希望两个时长可以比较,则必须使用System.nanoTime()
michelpm's

12

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

例如:

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


7

System.currentTimeMillis()java中in返回从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 :)


4
DateTime.Now使用本地时间,而不是UTC。我不知道从本地地址中减去未知类型的DateTime时会发生什么,但是最好将它们都设置为UTC :)
Jon Skeet

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

3
这不是有点不对吗?此扩展方法将移交给DateTime的任何实例,但不使用该实例。似乎令人困惑...我认为您不应该要求使用不使用的参数
mortb 2014年

1
@mortb这是扩展方法。这就是在C#中定义如何在不修改类的情况下向类“添加方法”的方法。编译器解释该方法,并将其应用于“ this”参数的实例,就好像它是类本身的实例方法一样。它的功能与静态类上的方法相同,但编译器允许编写更简单的替代语法。
Suncat2000

1
问题是d未使用参数的值。要使用此代码,您可以编写var date = new DateTime(); var millis = date.currentTimeMillis();但是date变量将只是多余的,并且其状态从未使用过。不使用对象的状态时,创建扩展方法只会使代码模糊。@Hath提供的答案更加直接,因此(对我而言)更好。也许@Joel Coehoorn打算使用值d而不是DateTime.UtcNow方法主体中的值?我经常使用扩展方法,但并非如此。
mortb

您为什么要创建不使用日期的扩展名?我使用了这段代码,这让我很困惑。正确的版本是:return(long)(((d.ToUniversalTime()-Jan1st1970).TotalMilliseconds);
Mark G

4

这是一种近似Unix时间戳的简单方法。使用UTC更接近于unix概念,因此您需要隐瞒fromdoublelong

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

正是我需要的。
阿吉波拉


3

我只是考虑如何实现您一直追求的最直接的方法,如下所示:

DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond

1
DateTime.UtcNow是更好的选择
Mehdi Khademloo

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 Windows:

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

1

我知道问题要等价,但由于我将这2个用于在GetTickCount中抛出的相同任务。我可能怀旧,但System.currentTimeMillis()和GetTickCount()是我用来获取报价的唯一工具。

[DllImport("kernel32.dll")]
static extern uint GetTickCount();

// call
uint ticks = GetTickCount();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.