【问题标题】:How to convert Javascript datetime to C# datetime?如何将 Javascript 日期时间转换为 C# 日期时间?
【发布时间】:2011-10-05 20:56:43
【问题描述】:

我一直在阅读,如果您想从 JavaScript 日期转换为 C# 日期,您应该使用 getTime(),然后将该结果添加到 C# DateTime

假设我有这个 JavaScript 时间:

Date {Tue Jul 12 2011 16:00:00 GMT-0700 (Pacific Daylight Time)}

渲染到1310522400000毫秒

var a = new DateTime(1970, 01, 01).AddMilliseconds(1310522400000);

// result
7/13/2011 2:00:00 AM

所以这是错误的。我不确定我需要做什么。

【问题讨论】:

  • 它们是相同的... 2011 年 7 月 13 日上午 2:00:00 - 7(格林威治标准时间增量)-1 夏令时 = 2011 年 7 月 12 日星期二 16:00:00 GMT-0700(太平洋夏令时)
  • @Cyber​​nate,我想你出局了。 16:00 和 2:00 之间有 10 小时的时差。
  • @Hand:你说得对..我想该睡觉了..

标签: c# javascript .net datetime


【解决方案1】:

您可以使用 toJSON() JavaScript 方法,它将 JavaScript DateTime 转换为 C# 可以识别的 DateTime。

JavaScript 代码如下所示

var date = new Date();
date.toJSON(); // this is the JavaScript date as a c# DateTime

注意:结果将以UTC时间为准

【讨论】:

  • 它是一个很好的解决方案,但它会从实际时间中减去时间,这意味着我有挪威时间,它是 11:34,它给了我 09:34,你能解释一下吗?
  • 我必须在我的 REST 服务上接受它作为“字符串”,然后将其转换为 DateTime。否则,由于签名不正确,不会调用 REST 服务方法。
  • @MHanif - 我相信是因为 .toJSON() 是在 UTC 时间
  • 是的@Gwasshoppa 正确,我已经更新了答案以反映您的评论。谢谢!
  • @MHanif 在服务器端 UTC 时间,您可以使用 .ToLocalTime() docs.microsoft.com/en-us/dotnet/api/…轻松转换为本地时间@
【解决方案2】:

首先使用 JavaScript 中的以下函数创建所需格式的字符串

var date = new Date();
var day = date.getDate();       // yields date
var month = date.getMonth() + 1;    // yields month (add one as '.getMonth()' is zero indexed)
var year = date.getFullYear();  // yields year
var hour = date.getHours();     // yields hours 
var minute = date.getMinutes(); // yields minutes
var second = date.getSeconds(); // yields seconds

// After this construct a string with the above results as below
var time = day + "/" + month + "/" + year + " " + hour + ':' + minute + ':' + second; 

将此字符串传递给代码隐藏函数并将其作为字符串参数接受。使用代码隐藏中的DateTime.ParseExact()将此字符串转换为DateTime,如下所示,

DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);

希望这会有所帮助...

【讨论】:

  • 如果javascript只返回一个数字,你应该在前面附加一个“0”。为此,您应该使用“HH.length()”、“mm.length()”等......并相应地构造字符串(var Time)。
  • getYear 已弃用。使用 .getFullYear
  • 它对我有用,但正如之前所说,我使用了 Date.getFullYear()。
  • 使用 getDate() getDay() 返回星期几(索引)
  • 在 javascript 中 getMonth() 也是从零开始的,所以你会在 7 月得到 6,这将导致 C# 中的月份错误
【解决方案3】:

你几乎是对的,只需要做一点小修正:

var a = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
    .AddMilliseconds(1310522400000)
    .ToLocalTime();

【讨论】:

  • 当我测试它时,它在 2:50 关闭
【解决方案4】:

如果您想从 JS 向 C# 发送日期,这实际上非常简单 - 如果可以接受发送 UTC 日期。

var date = new Date("Tue Jul 12 2011 16:00:00 GMT-0700");
var dateStrToSendToServer = date.toISOString();

...发送到C#端...

var success = DateTimeOffset.TryParse(jsISOStr, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var result);

C# DateTime 已经理解 ISO 日期格式,并且可以很好地解析它。

要从 C# 格式化为 JS,只需使用 DateTime.UtcNow.ToString("o")

就个人而言,我从不习惯依靠不同环境之间的数学和逻辑来获得毫秒/滴答声来显示用户可能在客户端上看到的完全相同的日期和时间(尤其是在重要的地方)。在转移货币时我也会这样做(为了安全起见,使用字符串代替,或者在两个不同的整数之间分隔美元和美分)。将日期/时间作为单独的值发送会很好(请参阅accepted answer)。

【讨论】:

    【解决方案5】:

    DateTime.Parse 是一个更好的选择。 JS 日期和 C# 日期不是从同一个根开始的。

    示例:

    DateTime dt = DateTime.ParseExact("Tue Jul 12 2011 16:00:00 GMT-0700",
                                      "ddd MMM d yyyy HH:mm:ss tt zzz",
                                      CultureInfo.InvariantCulture);
    

    【讨论】:

    • 这个问题是我不知道如何将你拥有的硬编码字符串从 ajax 获取到我的 MVC 操作方法。如果我尝试传入日期对象,它不会发送它。即使我在操作方法中使用 like "string" 作为参数。
    • 您的意思是您无法将您的 JS Date 序列化为 string 为已知格式(例如 Date.toUTCString() 并将其发送到您的 MVC 操作?您可以发布您的 ajax 代码吗?
    • Date.toUTCString() 返回GMT 的结尾(无时区偏移量#)。格式的GMTzzzzz 部分会导致解析失败。另外,您缺少逗号。最后,它不适用于具有不同区域设置的所有客户端。在我的系统上,它是“星期日,2018 年 2 月 4 日 09:50:00 GMT”(注意月前一天)。
    • @JamesWilkins 感谢您指出格式字符串中的错字。此外,这些答案并不意味着是生产就绪代码,也不是处理所有可能的排列。示例代码基于 OP 的代码示例。本地化/国际化是一个更深层次的主题。
    • 我基于“如何将 Javascript 日期时间转换为 C# 日期时间?”这个问题。 OP 只显示了一个 Date 输出,它不是他们代码的一部分。在 JS 和 C# 之间使用除 ISO 格式之外的 anything 的方法对于任何新阅读本文的人来说都是一个坏主意。 ;) 使用{Date}.toISOString(),C# 会自然解析它。
    【解决方案6】:

    由于我在不同的时区,我的 JavaScript 和 C# 最终在同一日期之间有 2 小时的差异(即使我尝试将日期作为日期发送到 Web 服务 [未转换为字符串/另一个对象] )。

    我尝试在 JavaScript 中使用 getTime() 并将毫秒添加到 C# 日期(从 1970 年 1 月 1 日开始),但我的 C# 日期总是提前两个小时结束。

    为了让我在双方都获得相同的日期和时间,我最终这样做了:

    在 JavaScript 中我使用了 UTC 函数:

    var jsDate = Date.UTC(year,month,day,hours,minutes,seconds,millisec);
    

    在 C# 中,为了获得正确的 DateTime,我这样做了:

    var date = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddMilliseconds(jsDate);
    

    希望对某人有所帮助。

    【讨论】:

      【解决方案7】:

      如果您在应用程序中使用 moment.js。

      var x= moment(new Date()).format('DD/MM/YYYY hh:mm:ss')

      x 传递给代码隐藏函数并将其作为字符串参数接受。使用c#中的DateTime.ParseExact()将此字符串转换为DateTime如下,

      DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
      

      【讨论】:

      • 您的 javascript 代码可能应该是 HH:mm:ss,因为您在后端有 HH。如果不是,则 1700 小时变为 0500 小时。
      【解决方案8】:

      更新:从 .NET 版本 4.6 开始,改用 DateTimeOffset 结构的 FromUnixTimeMilliseconds 方法:

      DateTimeOffset.FromUnixTimeMilliseconds(1310522400000).DateTime
      

      【讨论】:

        【解决方案9】:

        如果您在美国太平洋时区,那么您的时代是下午 4 点。 1969 年 12 月 31 日。您将自纪元以来的毫秒数添加到

        new DateTime(1970, 01, 01)
        

        由于它没有时区,因此被解释为在您的时区。

        将时间瞬间视为自纪元以来的毫秒数并没有什么错,但要理解纪元只是 1970-01-01T00:00:00Z。

        当表示为日期时,没有时区,您无法想象时间中的瞬间。

        【讨论】:

          【解决方案10】:

          我认为您可以使用TimeZoneInfo....来转换日期时间....

              static void Main(string[] args)
              {
                  long time = 1310522400000;
                  DateTime dt_1970 = new DateTime(1970, 1, 1);
                  long tricks_1970 = dt_1970.Ticks;
                  long time_tricks = tricks_1970 + time * 10000;
                  DateTime dt = new DateTime(time_tricks);
          
                  Console.WriteLine(dt.ToShortDateString()); // result : 7/13
                  dt = TimeZoneInfo.ConvertTimeToUtc(dt);
          
                  Console.WriteLine(dt.ToShortDateString());  // result : 7/12
                  Console.Read();
              }
          

          【讨论】:

            【解决方案11】:

            JavaScript (HTML5)

            function TimeHelper_GetDateAndFormat() {
                var date = new Date();
            
                return MakeValid(date.getDate()).concat(
                    HtmlConstants_FRONT_SLASH,
                    MakeValid(date.getMonth() + 1),
                    HtmlConstants_FRONT_SLASH,
                    MakeValid(date.getFullYear()),
                    HtmlConstants_SPACE,
                    MakeValid(date.getHours()),
                    HtmlConstants_COLON,
                    MakeValid(date.getMinutes()),
                    HtmlConstants_COLON,
                    MakeValid(date.getSeconds()));
            }
            
            function MakeValid(timeRegion) {
                return timeRegion !== undefined && timeRegion < 10 ? ("0" + timeRegion).toString() : timeRegion.toString();
            }
            

            C#

            private const string DATE_FORMAT = "dd/MM/yyyy HH:mm:ss";
            
            public DateTime? JavaScriptDateParse(string dateString)
            {
                DateTime date;
                return DateTime.TryParseExact(dateString, DATE_FORMAT, CultureInfo.InvariantCulture, DateTimeStyles.None, out date) ? date : null;
            }
            

            【讨论】:

              【解决方案12】:

              哈伦的回答有一些错误,在下面更正:

              1) 哈伦使用getDay() 的日期不正确应该是getDate()

              2) getMonth() 比实际月份少一个月,所以我们应该将其增加 1,如下所示

              var date = new Date();
              var day = date.getDate();           // yields 
              var month = date.getMonth() + 1;    // yields month
              var year = date.getFullYear();      // yields year
              var hour = date.getHours();         // yields hours 
              var minute = date.getMinutes();     // yields minutes
              var second = date.getSeconds();     // yields seconds
              
              // After this construct a string with the above results as below
              var time = day + "/" + month + "/" + year + " " + hour + ':' + minute + ':' + second; 
              

              将此字符串传递给代码隐藏函数并将其作为字符串参数接受。使用代码隐藏中的DateTime.ParseExact()将此字符串转换为DateTime,如下所示,

              DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
              

              这对我有用! 希望这对您也有帮助。

              【讨论】:

                【解决方案13】:

                JS:

                 function createDateObj(date) {
                            var day = date.getDate();           // yields 
                            var month = date.getMonth();    // yields month
                            var year = date.getFullYear();      // yields year
                            var hour = date.getHours();         // yields hours 
                            var minute = date.getMinutes();     // yields minutes
                            var second = date.getSeconds();     // yields seconds
                            var millisec = date.getMilliseconds();
                            var jsDate = Date.UTC(year, month, day, hour, minute, second, millisec);
                            return jsDate;
                        }
                

                JS:

                var oRequirementEval = new Object();
                var date = new Date($("#dueDate").val());
                

                CS:

                requirementEvaluations.DeadLine = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
                    .AddMilliseconds(Convert.ToDouble( arrayUpdateRequirementEvaluationData["DeadLine"]))
                    .ToLocalTime();
                

                【讨论】:

                  【解决方案14】:

                  您还可以使用 Moment.js 库将 Js 时间发送到 C#:

                  JavaScript : var dateString = moment(new Date()).format('LLLL')

                  C#:DateTime.Parse(dateString);

                  【讨论】:

                  • 'LLLL' 格式对我不起作用.. 它适用于 ("MM/DD/YYYY HH:mm:ss")
                  【解决方案15】:
                  var date = new Date(this.newItemDate).toDateString();
                  

                  这行代码对我有用

                  【讨论】:

                    【解决方案16】:
                    Newtonsoft.Json.JsonConvert.SerializeObject(Convert.ToDateTime(dr[col.ColumnName])).Replace('"', ' ').Trim();
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2016-12-17
                      • 1970-01-01
                      • 2011-05-30
                      • 2012-08-03
                      • 2023-03-26
                      • 2012-05-28
                      • 1970-01-01
                      相关资源
                      最近更新 更多