在我的系统中,我在Ticks中存储一个持续时间,这个持续时间被传递给我的客户端移动应用程序,并且从那里我想将刻度转换为人类可读的形式。在我的情况下,天,小时和分钟。
我的客户端移动应用程序是使用Javascript编码的,所以这就是我用来将持续时间转换为天/小时/分钟的内容。
答案 0 :(得分:9)
在C#.NET中,单个刻度表示一百纳秒,或一千万分之一秒。 [Source]。
因此,为了计算从滴答数(舍入到最接近的整数)的天数,我首先计算乘以一千万的秒数,然后乘以一个秒的秒数。一天(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个蜱。
答案 1 :(得分:6)
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);
根据this page,setFullYear方法返回“一个数字,表示日期对象与1970年1月1日午夜之间的毫秒数”。
从javascript Date对象中查看this page所有方法。
答案 2 :(得分:4)
你需要考虑两件事:
解决强>
得分.Net的DateTime是0.1微秒,而Javascript算是毫秒。
<强>偏移强>
此外,.Net从1.1.0000计算,而Javascript从1.1.1970计算。
TeaFiles.Net有一个使用Java = Javascript ticks的Time类。它有一个scale属性和一个预定义的Timescale.Java缩放,它从.Net转换为Javascript。
答案 3 :(得分:2)
在服务器端,您可以使用扩展方法,如下所示:
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 = <the js ticks obtained from server-side>;
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&#34;日期&#34;对象参考:https://www.w3schools.com/jsref/jsref_obj_date.asp中所见)
答案 4 :(得分:0)
让我们让它更简单,壳我们?....
据微软称: public const long TicksPerDay = 864000000000;
https://docs.microsoft.com/en-us/dotnet/api/system.timespan.ticksperday?view=net-5.0
private int GetDaysDiff(DateTime fromDate, DateTime toDate)
{
long ticksPerDay = 864000000000;
long ticksDiff = Math.Abs(fromDate.Ticks - toDate.Ticks);
var days = ticksDiff / ticksPerDay;
return (int)days;
}
就是这样!