我一直在阅读如果你想从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
所以这是错的。我不确定我需要做什么。
答案 0 :(得分:27)
首先使用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函数并将其作为字符串参数接受。使用代码隐藏中的DateTime.ParseExact()
将此字符串转换为DateTime
,如下所示,
DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
希望这会有所帮助......
答案 1 :(得分:26)
您可以使用 toJSON() JavaScript方法,它将JavaScript DateTime转换为C#可识别为DateTime的内容。
JavaScript代码如下所示
var date = new Date();
date.toJSON(); // this is the JavaScript date as a c# DateTime
答案 2 :(得分:24)
你几乎是对的,只需要做一点修复:
var a = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
.AddMilliseconds(1310522400000)
.ToLocalTime();
答案 3 :(得分:6)
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);
答案 4 :(得分: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 :(得分:3)
由于我处于不同的时区,我的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);
希望它有所帮助。
答案 6 :(得分:3)
如果您在应用程序中使用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);
答案 7 :(得分:1)
如果您在美国太平洋时区,那么您的时代是下午4点。在1969年12月31日。您将自纪元以来的毫秒添加到
new DateTime(1970, 01, 01)
由于没有时区,因此被解释为 时区。
从时代开始,将时间瞬间想象为毫秒并没有真正的错误,但理解时代只是1970-01-01T00:00:00Z。
当没有时区表示为日期时,您无法想到时间的瞬间。
答案 8 :(得分:0)
我认为您可以使用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();
}
答案 9 :(得分:0)
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();
}
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;
}
答案 10 :(得分:0)
哈伦的答案中有一些错误在下面纠正:
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函数并将其作为字符串参数接受。使用代码隐藏中的DateTime.ParseExact()
将此字符串转换为DateTime
,如下所示,
DateTime.ParseExact(YourString, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
这对我有用! 希望这也对你有帮助。
答案 11 :(得分:0)
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();
答案 12 :(得分:0)
更新:从.NET版本4.6开始使用FromUnixTimeMilliseconds结构的DateTimeOffset方法:
DateTimeOffset.FromUnixTimeMilliseconds(1310522400000).DateTime
答案 13 :(得分:0)
您还可以使用Moment.js库将Js时间发送到C#:
JavaScript:var dateString = moment(new Date()).format('LLLL')
C#:DateTime.Parse(dateString);
答案 14 :(得分:0)
Newtonsoft.Json.JsonConvert.SerializeObject(Convert.ToDateTime(dr[col.ColumnName])).Replace('"', ' ').Trim();
答案 15 :(得分:-1)
我能够使用@Garth指出的解决方案来解决问题。
date.toJSON()