【发布时间】:2010-09-22 08:36:06
【问题描述】:
C# 中 Java 的 System.currentTimeMillis() 等价于什么?
【问题讨论】:
-
只是好奇,为什么你需要 1970 年以来的 Millis?
-
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
C# 中 Java 的 System.currentTimeMillis() 等价于什么?
【问题讨论】:
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
【讨论】:
DateTimeOffset 方法是从 .Net 4.6 开始引入的。
如果您想在 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;
}
【讨论】:
我只是考虑如何实现您一直在努力的目标的最直接方法如下:
DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond
【讨论】:
DateTime.UtcNow 是更好的选择
我知道问题要求等效,但由于我将这 2 个用于相同的任务,因此我在 GetTickCount 中提出。我可能很怀旧,但 System.currentTimeMillis() 和 GetTickCount() 是我用来获取刻度的唯一方法。
[DllImport("kernel32.dll")]
static extern uint GetTickCount();
// call
uint ticks = GetTickCount();
【讨论】:
如果您对 TIMING 感兴趣,请添加对 System.Diagnostics 的引用并使用秒表。
例如:
var sw = Stopwatch.StartNew();
...
var elapsedStage1 = sw.ElapsedMilliseconds;
...
var elapsedStage2 = sw.ElapsedMilliseconds;
...
sw.Stop();
【讨论】:
Java 中的一个常见习惯用法是将 currentTimeMillis() 用于计时或调度目的,您对自 1970 年以来的实际毫秒数不感兴趣,而是计算一些相对值并将 currentTimeMillis() 的后续调用与该值进行比较价值。
如果这就是您要查找的内容,那么 C# 等效项是 Environment.TickCount。
【讨论】:
C# give : 2688547 和 Java give : 1390707872687
System.currentTimeMillis() 返回自 1970 年以来的 UTC 时间(以毫秒为单位),而 Environment.TickCount 返回自应用程序启动以来的毫秒数。 System.currentTimeMillis() 适用于检查经过的时间,但如果您希望两个持续时间具有可比性,则必须使用 System.nanoTime()。
我们也可以花点心思,把它作为一个扩展方法,让它挂在 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);
}
}
【讨论】:
d的值。要使用此代码,您可以编写 var date = new DateTime(); var millis = date.currentTimeMillis(); 但 date 变量只是多余的,并且它的状态从未使用过。当不使用创建扩展方法的对象的状态时,只会模糊代码。 @Hath 提供的答案更直接,因此(对我而言)更好。也许@Joel Coehoorn 打算在方法主体中使用值d 而不是DateTime.UtcNow?我经常使用扩展方法,但不是为了这个。
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
【讨论】:
另一种选择:
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;
}
【讨论】:
该框架不包括自 1970 年以来的旧秒数(或毫秒)。您得到的最接近的是 DateTime.Ticks,它是自 0001 年 1 月 1 日以来的 100 纳秒数。
【讨论】: