Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 日期时间到javascript日期_C#_.net_Javascript - Fatal编程技术网

C# 日期时间到javascript日期

C# 日期时间到javascript日期,c#,.net,javascript,C#,.net,Javascript,Stackoverflow的另一个答案是从Javascript日期到.net日期时间的转换: long msSinceEpoch = 1260402952906; // Value from Date.getTime() in JavaScript return new DateTime(1970, 1, 1) + new TimeSpan(msSinceEpoch * 10000); 但反过来怎么做呢?DateTime到Javascript日期?试试: return DateTime.Now

Stackoverflow的另一个答案是从Javascript日期到.net日期时间的转换:

long msSinceEpoch = 1260402952906; // Value from Date.getTime() in JavaScript
return new DateTime(1970, 1, 1) + new TimeSpan(msSinceEpoch * 10000);
但反过来怎么做呢?DateTime到Javascript日期?

试试:

return DateTime.Now.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds
编辑:真正的UTC更好,但我们需要保持一致

return DateTime.UtcNow
               .Subtract(new DateTime(1970,1,1,0,0,0,DateTimeKind.Utc))
               .TotalMilliseconds;

不过,仔细想想,这并不重要,只要两个日期都在同一时区。

这应该可以做到:

date.Subtract(new DateTime(1970, 1,1)).TotalMilliseconds

JavaScript日期构造函数接受自Unix纪元(1970年1月1日00:00:00 UTC)以来的毫秒数。下面是将.Net DateTime对象转换为JavaScript日期的C#扩展方法:

public static class DateTimeJavaScript
{
   private static readonly long DatetimeMinTimeTicks =
      (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).Ticks;

   public static long ToJavaScriptMilliseconds(this DateTime dt)
   {
      return (long)((dt.ToUniversalTime().Ticks - DatetimeMinTimeTicks) / 10000);
   }
}
JavaScript用法:

var dt = new Date(<%= DateTime.Today.ToJavaScriptMilliseconds() %>);
alert(dt);
var dt=新日期();
警报(dt);

我知道这有点晚了,但当你想独立于时区时,我必须想出一个解决方案来处理日期。本质上,它涉及将所有内容转换为UTC

从Javascript到服务器

将日期作为删除时区偏移的历元值发送

var d=新日期(2015,0,1)//2015年1月1日
//对服务器的Ajax请求。。。
$.ajax({
url:“/target”,
参数:{date:d.getTime()-(d.getTimezoneOffset()*60*1000)}
});
然后服务器接收1420070400000作为日期

在服务器端,将该历元值转换为datetime对象:

DateTime d=newdatetime(1970,1,1,0,0,0).add毫秒(历元);
此时,日期只是用户提供的日期/时间。实际上是UTC

走另一条路

当服务器从数据库中提取数据时(可能是UTC),将差异作为一个历元(确保两个日期对象都是本地或UTC):

long ms=(long)utcDate.Subtract(新日期时间(1970,1,1,0,0,0,DateTimeKind.Utc)).total毫秒;

long ms=(long)localDate.Subtract(new DateTime(1970,1,1,0,0,0,DateTimeKind.Local)).total毫秒;
当javascript收到这个值时,创建一个新的日期对象。但是,此日期对象将假定为本地时间,因此需要按当前时区对其进行偏移:

var epochValue=1420070400000//从服务器中提取的值。
var utcDateVal=新日期(epochValue);
var actualDate=新日期(utcDateVal.getTime()+(utcDateVal.getTimezoneOffset()*60*1000))
console.log(utcDateVal);//2014年12月31日星期三19:00:00 GMT-0500(东部标准时间)
console.log(实际日期);//2015年1月1日星期四00:00:00 GMT-0500(东部标准时间)

据我所知,这适用于任何需要显示独立于时区的日期的时区。

您可以在操作中尝试:

return DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss");
这就是Ajax成功的原因:

success: function (resultDateString) {
    var date = new Date(resultDateString);
}
或者在您看来:(Javascript加上C#)

简单使用:

var jsDate = moment(netDateTime).toDate();

其中,
netDateTime
是序列化的DateTime变量,类似于
“/Date(1456956000000+0200)/”

此方法适用于我:

   public sCdateToJsDate(cSDate: any): Date {
        // cSDate is '2017-01-24T14:14:55.807'
        var datestr = cSDate.toString();
        var dateAr = datestr.split('-');
        var year = parseInt(dateAr[0]);
        var month = parseInt(dateAr[1])-1;
        var day = parseInt(dateAr[2].substring(0, dateAr[2].indexOf("T")));
        var timestring = dateAr[2].substring(dateAr[2].indexOf("T") + 1);
        var timeAr = timestring.split(":");
        var hour = parseInt(timeAr[0]);
        var min = parseInt(timeAr[1]);
        var sek = parseInt(timeAr[2]);
        var date = new Date(year, month, day, hour, min, sek, 0);
        return date;
    }

如果您将MVC与razor一起使用

-----剃刀/C#

  • 1:用C#创建列表并填充
  • 2:在javascript中创建一个数组
  • 3:使用razor迭代列表
  • 4:使用@:切换回js,使用@切换到C#
  • 5:月中的-1用于更正js中的月数

祝你好运

又一个迟来的答案,但这里没有这个。如果要在javascript中处理序列化的
/Date(1425408717000)/
的转换,只需调用:

var cSharpDate = "/Date(1425408717000)/"
var jsDate = new Date(parseInt(cSharpDate.replace(/[^0-9 +]/g, '')));

来源:

您可能希望使用DateTime.UtcNow而不是DateTime.now关于您的第二个想法:在夏时制前后的过渡期间,这确实很重要(我总是很难记住哪个:)。在转换过程中,2:00到3:00的时间重复两次。这意味着在一个小时内,javascript日期将关闭一个小时。UTC没有DLS,所以它没有这个问题。我这里有相同的代码,但它使javascript日期相差5:30,而C#date工作正常。在类似这样的问题中,显然与ajax相关,您应该指定在哪里进行转换,考虑到JSON中没有日期序列化的标准,并且您可能正在处理MS date munging,例如/date(020202)/请确保也清楚这一点。幸运的是,你应该把你所指的答案链接到我的最简单、最容易理解的答案上。这是一个答案,但是,糟糕。我不推荐。两个黑客不等于一个权利。微软的序列化是一种令人厌恶的黑客行为。@Suncat2000这种黑客行为怎么样?若您使用的是从服务器到前端检索价值的服务,我不知道还有什么更好的选择。这是本页上问题的最干净的解决方案。如果您知道更好的替代方案,请给我们举个例子:C#用法long date=DateTimeJavaScript.tojavascriptmillides(DateTime);签入javascript(在Google Chrome中按F12并转到控制台)var date=新日期(长);log(date.toString());为什么不仅仅是JavaScript构造函数
新日期(netDateTime)
var jsDate = moment(netDateTime).toDate();
   public sCdateToJsDate(cSDate: any): Date {
        // cSDate is '2017-01-24T14:14:55.807'
        var datestr = cSDate.toString();
        var dateAr = datestr.split('-');
        var year = parseInt(dateAr[0]);
        var month = parseInt(dateAr[1])-1;
        var day = parseInt(dateAr[2].substring(0, dateAr[2].indexOf("T")));
        var timestring = dateAr[2].substring(dateAr[2].indexOf("T") + 1);
        var timeAr = timestring.split(":");
        var hour = parseInt(timeAr[0]);
        var min = parseInt(timeAr[1]);
        var sek = parseInt(timeAr[2]);
        var date = new Date(year, month, day, hour, min, sek, 0);
        return date;
    }
var dt1 = DateTime.Now.AddDays(14).Date;
    var dt2 = DateTime.Now.AddDays(18).Date;

    var lstDateTime = new List<DateTime>();
    lstDateTime.Add(dt1);
    lstDateTime.Add(dt2);
$(function() {

            var arr = []; //javascript array

            @foreach (var item in lstDateTime)
             {
                @:arr1.push(new Date(@item.Year, @(item.Month - 1), @item.Day));
             }
var cSharpDate = "/Date(1425408717000)/"
var jsDate = new Date(parseInt(cSharpDate.replace(/[^0-9 +]/g, '')));