【问题标题】:Convert C# .NET DateTime.ticks to days/hours/mins in JavaScript在 JavaScript 中将 C# .NET DateTime.ticks 转换为天/小时/分钟
【发布时间】:2013-03-07 08:22:13
【问题描述】:

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

我的客户端移动应用程序是使用 Javascript 编码的,因此我使用它来将持续时间转换为天/小时/分钟。

【问题讨论】:

    标签: c# javascript .net datetime


    【解决方案1】:

    让我们让它变得更简单,shell 我们?....

    根据微软: 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;
    }
    

    就是这样!

    【讨论】:

      【解决方案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“日期”对象参考中看到的那样:https://www.w3schools.com/jsref/jsref_obj_date.asp

      【讨论】:

        【解决方案3】:
        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 日午夜之间的毫秒数”。

        查看 this page 以获取 javascript Date 对象中的所有方法。

        【讨论】:

        • 我已经使用这种方法来计算日期(636874594860000000 滴答声),但我不知道为什么在 Javascript 中我得到“Wed Mar 06 2019 10:12:50 GMT+0100”时实际上它是“{06/03/2019 08:58:06}”(这是 .NET 中的 new DateTime(636874594860000000) 返回的值)。我担心分钟的延迟(当然,小时之间的差异是正常的)。
        • 这很奇怪。当我将这个函数与您指定的刻度一起使用时,我将得到 Wed Mar 06 2019 09:38:34 GMT+0100(欧洲中部标准时间),这与 C# DateTime 相同。你确定你得到了正确的刻度吗? jsfiddle.net/pkmelee337/gwL5up4j/1
        • 是的,非常非常奇怪......我已经执行了你刚刚发布的 jsfiddle,但我仍然得到错误的日期“2019 年 3 月 6 日星期三 10:12:50 GMT+0100 ( hora estándar de Europa central)”。即使你得到的价值也不是实际的……我想深入研究这个问题,但我真的迷路了……我可以从哪里开始检查这个问题?
        • 嗯,它可能与时区有关。 (但分钟的差异仍然很奇怪)你能检查一下这个吗? jsfiddle.net/pkmelee337/gwL5up4j/3 我添加了 Date.UTC() 以确保在 UTC 上创建日期。否则我真的不知道从哪里开始。
        • 成功了!我只需将 0 传递给年份 setFullYear(0),因为它显示的是 2020 年的日期。但至少,现在的会议记录是正确的。无论如何,与时区有关的非常奇怪的问题......
        【解决方案4】:

        在 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 分钟(向上取整)。

        再举一个例子,有 2,193,385,800,000,000 个滴答声,我们得到 2538 天 15 小时 23 分钟。

        【讨论】:

        • 请使用10e7 而不是10000000,这就是指数符号的用处!
        • @Antonijn:这很acceptable behavior
        • @CL4PTR4P 好的,我不知道这个,谢谢你的启发!
        • 10e7 在 1 之后有 8 个零。10000000 实际上是 10e6 :)
        【解决方案5】:

        你需要考虑两件事:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-14
          • 1970-01-01
          • 2010-10-08
          相关资源
          最近更新 更多