将C#.NET DateTime.ticks转换为JavaScript中的天/小时/分钟

在我的系统中,我在Ticks中存储一个持续时间,这个持续时间被传递给我的客户端移动应用程序,并且从那里我想将ticks转换为人类可读的forms。 在我的情况下,天,小时和分钟。

我的客户端移动应用程序是使用Javascript编码的,所以这就是我用来将持续时间转换为天/小时/分钟的方法。

在C#.NET中,单个刻度表示一百纳秒,或一千万分之一秒。 [来源] 。

因此,为了计算从滴答数(舍入到最接近的整数)的天数,我首先计算乘以一千万的秒数,然后乘以一天中的秒数(60)以分钟为单位,每小时60分钟,每天24小时)。 我使用模数运算符(%)来获取构成小时和分钟持续时间的余数值。

var time = 3669905128; // Time value in ticks var days = Math.floor(time/(24*60*60*10000000)); // Math.floor() rounds a number downwards to the nearest whole integer, which in this case is the value representing the day var hours = Math.round((time/(60*60*10000000)) % 24); // Math.round() rounds the number up or down var mins = Math.round((time/(60*10000000)) % 60); console.log('days: ' + days); console.log('hours: ' + hours); console.log('mins: ' + mins); 

因此,在上面的例子中,刻度数相当于6分钟(向上舍入)。

再举一个例子,我们获得了2538天,15小时和23分钟的票数为2,193,385,800,000,000。

你需要考虑两件事:

解析度
得分.Net的DateTime是0.1微秒,而Javascript算是毫秒。

抵消
此外,.Net从1.1.0000开始,而Javascript从1.1.1970开始计算。

TeaFiles.Net有一个使用Java = Javascript ticks的Time类。 它有一个scale属性和一个预定义的Timescale.Java缩放,它从.Net转换为Javascript。

 var ticks = 635556672000000000; //ticks are in nanotime; convert to microtime var ticksToMicrotime = ticks / 10000; //ticks are recorded from 1/1/1; get microtime difference from 1/1/1/ to 1/1/1970 var epochMicrotimeDiff = Math.abs(new Date(0, 0, 1).setFullYear(1)); //new date is ticks, converted to microtime, minus difference from epoch microtime var tickDate = new Date(ticksToMicrotime - epochMicrotimeDiff); 

根据此页面 ,setFullYear方法返回“A Number,表示日期对象与1970年1月1日午夜之间的毫秒数”。

查看此页面 ,了解javascript Date对象中的所有方法。

服务器端 ,您可以使用扩展方法,如下所示:

 public static class DateTimeExtensions { private static readonly long UnixEpochTicks = (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).Ticks; public static long? ToJavascriptTicks(this DateTime? value) { return value == null ? (long?)null : (value.Value.ToUniversalTime().Ticks - UnixEpochTicks) / 10000; } public static long ToJavascriptTicks(this DateTime value) { return (value.ToUniversalTime().Ticks - UnixEpochTicks) / 10000; } } 

使用此扩展,您可以获得javascript滴答,然后您只需将它们传递给客户端。

如果您使用的是MVC:

你有ViewModel:

 public class MyViewModel { public long MyJsTicks { get; set; } } 

和控制器:

 public ActionResult Action() { long myJsTicks = DateTime.UtcNow.ToJavascriptTicks(); //<-- use the extension method MyViewModel viewModel = new MyViewModel(); viewModel.MyJsTicks = myJsTicks; return View(viewModel); } 

客户端

 var jsticks = ; var mydatetime = new Date(jsticks); 

如果您正在为移动应用程序使用Razor视图引擎,则使用内联表达式从视图中的服务器端获取计算的js滴答非常简单:

 var jsticks = @(Model.MyJsTicks); var mydatetime = new Date(jsticks); 

最后,从javascript Date对象获取日,小时和分钟:

 var hours = mydatetime.getHours(); var minutes = mydatetime.getMinutes(); var seconds = mydatetime.getSeconds(); 

(正如您在javascript“日期”对象参考中所见: https : //www.w3schools.com/jsref/jsref_obj_date.asp )