11

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

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

4

5 回答 5

10

在 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 分钟。

于 2013-03-18T20:29:41.193 回答
9
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 对象的所有方法。

于 2016-09-28T19:24:26.497 回答
4

你需要考虑两件事:

.Net 的 DateTime 中的分辨率
刻度为 0.1 微秒,而 Javascript 以毫秒为单位。

偏移
量 此外,.Net 从 1.1.0000 开始计数,而 Javascript 从 1.1.1970 开始计数。

TeaFiles.Net有一个 Time 类,它使用 Java = Javascript 滴答声。它有一个比例属性和一个预定义的 Timescale.Java 比例,可以从 .Net 转换为 Javascript。

于 2013-03-18T21:03:13.497 回答
3

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

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 )

于 2017-05-01T16:25:53.743 回答
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;
}

就是这样!

于 2021-01-18T15:15:45.353 回答