如何将 Javascript 日期时间转换为 C# 日期时间?

Posted

技术标签:

【中文标题】如何将 Javascript 日期时间转换为 C# 日期时间?【英文标题】:How to convert Javascript datetime to C# datetime? 【发布时间】: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:你说得对..我想该睡觉了.. 可能重复:***.com/questions/1877788/… 【参考方案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();

【讨论】:

以上是关于如何将 Javascript 日期时间转换为 C# 日期时间?的主要内容,如果未能解决你的问题,请参考以下文章

将 C# DateTime 转换为 Javascript 日期

如何将 JavaScript 日期对象转换为刻度

如何将 JavaScript 日期转换为 MySQL 日期时间格式? [复制]

如何在 C# 中将字节 [] 转换为日期时间?

如何将 solr 日期转换为 javascript 日期?

如何在 .Net / C# 中将日期转换为 HTTP 格式的日期