Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的Java System.currentTimeMillis()等价物#_C#_Java_.net_Datetime - Fatal编程技术网

C# C语言中的Java System.currentTimeMillis()等价物#

C# C语言中的Java System.currentTimeMillis()等价物#,c#,java,.net,datetime,C#,Java,.net,Datetime,与C#中Java的System.currentTimeMillis()等价的是什么?该框架不包括自1970年以来的旧秒(或毫秒)。最接近的是DateTime.Ticks,它是自0001年1月1日以来的100纳秒数。另一种选择: private static readonly DateTime Jan1st1970 = new DateTime (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); public static long CurrentTimeM

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

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

另一种选择:

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

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

这里有一个简单的方法来近似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

我们还可以做一点想象,把它作为一个扩展方法,这样它就挂起了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);
    }
}

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


如果这正是您想要的,那么C#等价物就是
环境。滴答声
如果您对计时感兴趣,请添加对System.Diagnostics的引用并使用秒表

例如:

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

我知道这个问题要求的是等价的,但因为我把这两个问题用于相同的任务。我可能很怀旧,但System.currentTimeMillis()和GetTickCount()是我唯一用来获取刻度的工具

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

// call
uint ticks = GetTickCount();

我认为,最直接的方法是如何实现你一直在争取的:

DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond

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

C#:

爪哇:

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

DateTime。现在使用本地时间,而不是UTC。我不知道从本地日期时间中减去未知类型的日期时间时会发生什么,但最好将两者都设置为UTC:)只是好奇,为什么自1970年以来需要毫秒数?DateTimeOffset.UtcNow.TounixTimeMillissions()会(DateTime.Ticks/10000000)-(0001到1970之间的秒数)给出一个准确的答案?但他们都给出了不同的数字。他们如何正确比较
C#give:2688547
javagive:1390707872687
@Elshan你无法比较它们。它们是不同的蜱。此技术用于在应用程序内计时和调度,而不是跨应用程序。
System.currentTimeMillis()
返回1970年以来的UTC时间(毫秒),而
Environment.TickCount
返回自应用程序启动以来的毫秒
System.currentTimeMillis()
用于检查经过的时间,但如果您希望两个持续时间具有可比性,则必须使用
System.nanoTime()
。这正是我所需要的。这不是有点错吗?此扩展方法将传递给DateTime的任何实例,但它不使用该实例。看起来很困惑…我认为你不应该需要一个你不需要的参数use@mortb这是一种扩展方法。这就是C#中定义的在不修改类的情况下向类“添加方法”的方式。编译器解释该方法并将其应用于“this”参数的实例,就像它是类本身的实例方法一样。它的功能与静态类上的方法相同,但编译器允许编写更简单的替代语法。问题是没有使用参数
d
的值。要使用此代码,您可以编写
var date=new DateTime();var millis=date.currentTimeMillis()
但是
date
变量只是多余的,其状态从未被使用过。当不使用对象的状态时,创建扩展方法只会模糊代码。hads提供的答案更直截了当,因此(对我来说)更好。也许@Joel Coehoorn打算在方法体中使用值
d
,而不是
DateTime.UtcNow
?我经常使用扩展方法,但不是为了这个。为什么要创建一个不使用日期的扩展?我用了这个密码,它把我弄糊涂了。正确的版本是:return(long)((d.ToUniversalTime()-Jan1st1970.total毫秒)
DateTime.UtcNow
是一个更好的选项,它与从.Net 4.6开始引入的
DateTimeOffset
方法的“DateTimeOffset.UtcNow.tounixtimemilures()”结果相同。
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;
}
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;
}
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()