在我的系统中,我在 Ticks 中存储了一个持续时间,它被传递给我的客户端移动应用程序,然后我想从那里将 ticks 转换为人类可读的形式。在我的情况下,天,小时和分钟。
我的客户端移动应用程序是使用 Javascript 编码的,所以这就是我用来将持续时间转换为天/小时/分钟的方法。
在我的系统中,我在 Ticks 中存储了一个持续时间,它被传递给我的客户端移动应用程序,然后我想从那里将 ticks 转换为人类可读的形式。在我的情况下,天,小时和分钟。
我的客户端移动应用程序是使用 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 分钟(向上取整)。
再举一个例子,有 2,193,385,800,000,000 个滴答声,我们得到 2538 天 15 小时 23 分钟。
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 方法返回“一个数字,表示日期对象与 1970 年 1 月 1 日午夜之间的毫秒数”。
查看此页面以了解来自 javascript Date 对象的所有方法。
你需要考虑两件事:
.Net 的 DateTime 中的分辨率
刻度为 0.1 微秒,而 Javascript 以毫秒为单位。
偏移
量 此外,.Net 从 1.1.0000 开始计数,而 Javascript 从 1.1.1970 开始计数。
TeaFiles.Net有一个 Time 类,它使用 Java = Javascript 滴答声。它有一个比例属性和一个预定义的 Timescale.Java 比例,可以从 .Net 转换为 Javascript。
在服务器端,您可以使用扩展方法,如下所示:
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“日期”对象参考中看到的那样:https ://www.w3schools.com/jsref/jsref_obj_date.asp )
让我们让它更简单,壳我们?...
根据微软: 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;
}
就是这样!