【问题标题】:How can I compare a UTC date created in Javascript to a UTC date in C#?如何将 Javascript 中创建的 UTC 日期与 C# 中的 UTC 日期进行比较?
【发布时间】:2011-07-28 16:49:09
【问题描述】:

我正在尝试在一台服务器上的 JavaScript 中创建一个 UTC 日期,并通过 URL 查询字符串将其传递到另一台服务器,C# 可以在其中获取该查询字符串,将其识别为日期并将其与新的 C# UTC 日期进行比较 -事实证明,我更棘手(除非我只是度过那些日子之一)。我在 stackoverflow 上没有看到任何其他问题(在键入问题时显示的“类似标题”或“类似问题”列表中)。

为了在 JavaScript 中创建数据,我使用以下基于this w3schools article

var currentDate = new Date();
var  day = currentDate.getUTCDate();
var month = currentDate.getUTCMonth();
var year = currentDate.getUTCFullYear();
var hours = currentDate.getUTCHours();
var minutes = currentDate.getUTCMinutes();
var seconds = currentDate.getUTCSeconds();
var milliseconds = currentDate.getUTCMilliseconds();

var expiry = Date.UTC(month,day,year,hours,minutes,seconds,milliseconds);

结果看起来像这样1311871476074

那么,在 C# 中,我如何从查询字符串和

中获取这个值
  1. 将其转换为适当的日期,然后
  2. 将其与基于 C# 的 UTC DateTime 变量进行比较?

任何提示、对我的逻辑/代码或文章链接的更正将不胜感激。

凯文

更新
下面的两个答案都帮助我解决了我的问题:Luke 在 C# 方面提供了帮助,Ray 在 JavaScript 方面提供了帮助 - 不幸的是,我无法将它们都标记为答案,但我希望可以!

【问题讨论】:

    标签: c# javascript datetime utc


    【解决方案1】:

    JavaScript UTC method 返回自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。要将这些毫秒转换回 C# 中的 DateTime,您只需将它们添加到原始“纪元”:

    string rawMilliseconds = Request.QueryString["expiry"];
    
    if (string.IsNullOrWhiteSpace(rawMilliseconds))
        throw new InvalidOperationException("Expiry is null or empty!");
    
    long milliseconds;
    if (!long.TryParse(rawMilliseconds, out milliseconds))
        throw new InvalidOperationException("Unable to parse expiry!");
    
    DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    
    DateTime expiry = epoch.AddMilliseconds(milliseconds);
    

    【讨论】:

      【解决方案2】:

      日期时间对象表示时间的瞬间,通常在内部表示为自纪元以来的毫秒数。在 JavaScript 中获取当前时间的这个值更容易使用

      new Date().getTime()
      

      现在您只有一个数字(或包含数字的字符串),您可以将其传递给您的 C# 应用程序并从中构造一个 DateTime 对象。

      为此,我可以将您推荐给 C# convert UTC int to DateTime object(Jon Skeet 有一个答案。):)

      【讨论】:

      • 卢克上面的答案是我想要的。我没有在我的问题中提到它,但是执行 JavaScript 的服务器位于英国,而接受“到期”查询字符串的 .NET 服务器位于美国,因此在 JavaScipt 和 C# 中使用 UTC 日期至关重要,所以 .getTime() 在这种情况下对我不起作用。
      • 不用担心。但请注意,在 JavaScript 中,getTime 返回自纪元以来的毫秒数,并且完全独立于时区。许多开发人员更喜欢在内部使用这个纪元时间来进行所有时间处理,并且在显示时区之前(或者如果他们需要像“一个月前”这样的计算)从不使用时区。纪元时间不是 UTC,也不是任何时区。它们只是代表特定时刻的数字。值得掌握。 :)
      • 感谢您的跟进,雷。我整个早上都在研究 JavaScript,看到了 .getUTCyear.getYear,所以当我看到你提到 .getTime 时,我想这将是“常规”格式的当前时间。事实证明,var expiry = new Date.getTime();这正是我所需要的,结合上面卢克的 C# 信息。谢谢两位!
      猜你喜欢
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多