C# C语言中的Java System.currentTimeMillis()等价物#
与C#中Java的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
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()