如何将 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(太平洋夏令时) @Cybernate,我想你出局了。 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" 作为参数。 您的意思是您无法将您的 JSDate
序列化为 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 日期