如何将Javascript datetime转换为C#datetime?

时间:2011-07-15 04:30:58

标签: c# javascript .net 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

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

16 个答案:

答案 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)

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;
}

答案 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()