如何将Javascript datetime转换为C#datetime?
我一直在读,如果你想从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
所以这是错的。 我不确定我需要做什么。
首先使用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;
将此字符串传递给codebehind函数并将其作为字符串参数接受。使用codebehind中的DateTime.ParseExact()
将此字符串转换为DateTime
,如下所示,
DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
希望这可以帮助…
你几乎是对的,只需要做一点修复:
var a = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc) .AddMilliseconds(1310522400000) .ToLocalTime();
您可以使用toJSON() JavaScript方法,它将JavaScript DateTime转换为C#可以识别为DateTime的内容。
JavaScript代码如下所示
var date = new Date(); date.toJSON(); // this is the JavaScript date as ac# DateTime
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);
由于我在不同的时区,我的JavaScript和C#最终在同一日期之间有2小时的差异(即使我试图将日期作为日期发送到web服务[未转换为字符串/其他对象])。
我尝试在JavaScript中使用getTime()并将毫秒添加到C#日期(从1970-01-01开始),但我总是提前两个小时在我的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);
希望它可以帮到某人。
如果您在应用程序中使用moment.js。
var x = moment(new Date())。format(’DD / MM / YYYY hh:mm:ss’)
将x
传递给codebehind函数并将其作为字符串参数接受。 使用c#中的DateTime.ParseExact()
将此字符串转换为DateTime,如下所示,
DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
我想你可以使用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(); }
如果你在美国太平洋时区,那么你的时代是1969年12月31日下午4点。你加上自纪元以来的毫秒数
new DateTime(1970, 01, 01)
因为它没有时区,所以被解释为在你的时区。
将时间瞬间思考为自纪元以来的毫秒,但理解时代只是1970-01-01T00:00:00Z,没有什么不妥。
当表示为日期,没有时区时,您无法想到时间的瞬间。
如果你想从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")
。
就个人而言,我从不习惯依赖不同环境之间的数学和逻辑来获得毫秒/刻度来显示用户在客户端上看到的完全相同的日期和时间(特别是在重要的地方)。 我也会在转移货币时这样做(使用字符串代替安全,或者在两个不同的整数之间分开美元和美分)。 将日期/时间作为单独的值发送将是一件好事(参见接受的答案 )。
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; }
哈伦的答案中有一些错误在下面纠正:
1)harun使用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;
将此字符串传递给codebehind函数并将其作为字符串参数接受。使用codebehind中的DateTime.ParseExact()
将此字符串转换为DateTime
,如下所示,
DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
这对我有用! 希望这也对你有所帮助。
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();
更新 :从.NET版本4.6开始,使用DateTimeOffset结构的FromUnixTimeMilliseconds方法:
DateTimeOffset.FromUnixTimeMilliseconds(1310522400000).DateTime
您还可以使用Moment.js库将Js时间发送到C#:
JavaScript: var dateString = moment(new Date()).format('LLLL')
C#: DateTime.Parse(dateString);
我能够使用@Garth指出的解决方案解决问题。
date.toJSON()