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

时间:2013-03-18 20:29:41

标签: c# javascript .net datetime

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

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

5 个答案:

答案 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;
}

就是这样!