【问题标题】:How to convert JavaScript date object to ticks如何将 JavaScript 日期对象转换为刻度
【发布时间】:2011-12-19 11:24:19
【问题描述】:

我应该如何将 JavaScript 日期对象转换为刻度?我想在数据同步后使用刻度来获取我的 C# 应用程序的确切日期。

【问题讨论】:

  • 请记住,浏览器的日期/时间可以设置为任何时区,因此您的数据不会与服务器上的 UTC 相关。我通常通过将服务器的 utcnow 以刻度(相对于 1970 年)注入页面并在页面开始时存储该值与 +new Date() 之间的差异来进行补偿。然后所有日期/时间都可以抵消该数量。任何错误都会归结为页面延迟。

标签: c# javascript


【解决方案1】:

如果“滴答”是指“自纪元以来的毫秒数”,则可以调用“.getTime()”。

var ticks = someDate.getTime();

MDN documentation,返回值为一个

整数值,表示自 1970 年 1 月 1 日 00:00:00 UTC(Unix 纪元)以来的毫秒数。

【讨论】:

  • ticks != milliseconds ,所以在 C# 中,一个 tick 代表一百纳秒
【解决方案2】:

JavaScript Date 类型的起源是 Unix 纪元:1970 年 1 月 1 日午夜。

.NET DateTime 类型的起源是 0001 年 1 月 1 日午夜。

您可以将 JavaScript Date 对象转换为 .NET 记号,如下所示:

var yourDate = new Date();  // for example

// the number of .net ticks at the unix epoch
var epochTicks = 621355968000000000;

// there are 10000 .net ticks per millisecond
var ticksPerMillisecond = 10000;

// calculate the total number of .net ticks for your date
var yourTicks = epochTicks + (yourDate.getTime() * ticksPerMillisecond);

【讨论】:

  • (621355968e9 + (new Date()).getTime() * 1e4) 将这 4 行浓缩为您了解之后。很好的分享@LukeH
【解决方案3】:

应该是date.GetTime()。请注意,C# 和 Javascript 使用不同的初始日期,因此请使用类似这样的方法来转换为 C# DateTime。

public static DateTime GetDateTime(long jsSeconds)
{
    DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    return unixEpoch.AddSeconds(jsSeconds);
}

【讨论】:

    【解决方案4】:

    如果您想将您的DateTime 对象转换为通用刻度,请使用以下代码 sn-p:

    var ticks = ((yourDateObject.getTime() * 10000) + 621355968000000000);
    

    一毫秒有 10000 个滴答声。在 0001 年 1 月 1st 到 1970 年 1 月 1st 之间有 621.355.968.000.000.000 个滴答声。

    【讨论】:

    • 当你在 C# 中时,这会得到滴答声。有关 javascript 的方式,请参阅下面的 pointy 答案。
    • 添加的号码对我不起作用,它总是给我前一天的时间:21:00,但是这个(621356076000000000)工作正常,有什么想法吗??
    • 在 Google Chrome 56.0.2924.87(64 位)中正确的值是(621356076000000000),那么这两个值有什么区别呢?
    • 您的答案是什么编程语言 - c# 还是 JavaScript?即,这是在哪里实现的?
    • @muniR 我认为这是因为您混合了 UTC 和本地时间。 621355968000000000 是 UTC。您的号码 621356076000000000 将与您的本地时间一致(您的时区比 UTC 时间晚 3 小时)
    【解决方案5】:

    扩展已接受的答案作为添加 635646076777520000 的原因。

    Javascript new Date().getTime() or Date.now() 将返回从 midnight of January 1, 1970 传递的毫秒数。

    在 .NET 中(sourceRemarks 部分下)

    DateTime 值类型表示日期和时间,其值范围从 0001 年 1 月 1 日 00:00:00(午夜)到公元 9999 年 12 月 31 日晚上 11:59:59(CE)在公历中。

    621355968000000000 是从midnight Jan 1 01 CEmidnight Jan 1 1970 的刻度值

    所以,在 .NET 中

      Console.Write(new DateTime(621355968000000000))
      // output 1/1/1970 12:00:00 AM
    

    因此将 javascript 时间转换为 .Net 滴答声

     var currentTime = new Date().getTime();
    
     // 10,000 ticks in 1 millisecond
     // jsTicks is number of ticks from midnight Jan 1, 1970
     var jsTicks = currentTime * 10000;
    
     // add 621355968000000000 to jsTicks
     // netTicks is number of ticks from midnight Jan 1, 01 CE
     var netTicks = jsTicks + 621355968000000000;
    

    现在,在 .NET 中

     Console.Write(new DateTime(netTicks))
     // output current time
    

    【讨论】:

      【解决方案6】:

      JavaScript 中的日期也包含偏移量。如果您需要摆脱它,请使用以下内容:

      return ((date.getTime() * 10000) + 621355968000000000) - (date.getTimezoneOffset() * 600000000);
      

      我使用 Skeikh 的解决方案并减去“偏移”的刻度。

      【讨论】:

      • 谢谢,节省了我的时间,因为我一直在寻找细微的差别!
      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 2015-03-13
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      相关资源
      最近更新 更多