DateTime到javascript日期


98

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

long msSinceEpoch = 1260402952906; // Value from Date.getTime() in JavaScript
return new DateTime(1970, 1, 1) + new TimeSpan(msSinceEpoch * 10000);

但是,如何做到相反呢?DateTime到Javascript日期?


在类似这样的问题中,这些问题显然与ajax有关,您应该指定转换的位置,并考虑到JSON中没有日期序列化的标准,并且可能正在处理MS日期查询,例如/ Date(02020202 )/请确保也清楚。祝您好运
Sky Sanders'3

2
您应该链接您所指的答案
cdmckay 2014年

Answers:


116

尝试:

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;

虽然,再考虑也没关系,只要两个日期都在同一时区即可。


5
您可能要使用DateTime.UtcNow而不是DateTime.Now
Matt Dearing 2010年

2
关于您的第二个想法:在夏令时或从夏令时过渡的过程中,它确实很重要(我总是很难想清楚哪个是:)。在过渡期间,将2:00到3:00的时间重复两次。这意味着在一小时内,javascript日期将关闭一小时。UTC没有DLS,所以它没有这个问题。
塞巴斯蒂安M'1

我在这里有相同的代码,但它使JavaScript日期有5:30的差异,而C#日期工作正常。
Jenish Zinzuvadiya

44

JavaScript Date构造函数接受自Unix纪元(1970年1月1日UTC:00)以来的毫秒数。这是将.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);

C#用法long date = DateTimeJavaScript.ToJavaScriptMilliseconds(DateTime); 签入javascript(在Google Chrome中按F12并转到控制台)var date = new Date(long); console.log(date.toString());
Gonen09

24

您可以在“操作”中尝试以下操作:

return DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss");

在您的Ajax成功中,这就是:

success: function (resultDateString) {
    var date = new Date(resultDateString);
}

或者在您的视图中:(Javascript加C#)

var date = new Date('@DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")');

1
轻松快速地理解
FindOutIslamNow

对我来说最好的答案
Navid

23

使用Moment.js只需使用:

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

netDateTime您的DateTime变量在何处序列化,类似于"/Date(1456956000000+0200)/"


11

这应该可以解决问题:

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

4

我知道这有点晚了,但是当您想要不受时区限制时,这是我不得不想出的解决日期的解决方案。本质上,它涉及将所有内容转换为UTC。

从Javascript到Server

发送日期作为纪元值,并去除时区偏移。

var d = new Date(2015,0,1) // Jan 1, 2015
// Ajax Request to server ...
$.ajax({
  url: '/target',
  params: { date: d.getTime() - (d.getTimezoneOffset() * 60 * 1000) }
});

然后,服务器接收1420070400000作为日期时期。

在服务器端,将该纪元值转换为日期时间对象:

DateTime d = new DateTime(1970, 1, 1, 0, 0, 0).AddMilliseconds(epoch);

此时,日期仅是用户提供日期/时间时提供的日期/时间。实际上,它是UTC。

走另一条路

当服务器从数据库中提取数据时(大概是UTC),请以一个纪元来区别(确保两个日期对象都为本地或UTC):

long ms = (long)utcDate.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;

要么

long ms = (long)localDate.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local)).TotalMilliseconds;

当javascript收到此值时,请创建一个新的date对象。但是,此日期对象将被假定为本地时间,因此您需要将其偏移当前时区:

var epochValue = 1420070400000 // value pulled from server.
var utcDateVal = new Date(epochValue);
var actualDate = new Date(utcDateVal.getTime() + (utcDateVal.getTimezoneOffset() * 60 * 1000))

console.log(utcDateVal); // Wed Dec 31 2014 19:00:00 GMT-0500 (Eastern Standard Time)
console.log(actualDate); // Thu Jan 01 2015 00:00:00 GMT-0500 (Eastern Standard Time)

据我所知,这应该适用于您需要显示与时区无关的日期的任何时区。


3

此方法对我有用:

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

1

如果您将MVC与剃须刀一起使用

-----剃刀/ C#

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

--- JavaScript

$(function() {

            var arr = []; //javascript array

            @foreach (var item in lstDateTime)
             {
                @:arr1.push(new Date(@item.Year, @(item.Month - 1), @item.Day));
             }
  • 1:在C#中创建列表并填写
  • 2:在javascript中创建数组
  • 3:使用剃刀迭代列表
  • 4:使用@:切换回js,使用@切换至C#
  • 5:月份中的-1来更正js中的月份号。

祝好运


0
<input type="hidden" id="CDate" value="<%=DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")%>" />

为了将日期转换为JS日期(所有数字):

var JSDate = $("#CDate").val();
JSDate = Date.parse(JSDate);

0

另一个较晚的答案,但是这里没有。如果要处理/Date(1425408717000)/使用javascript 进行序列化的转换,只需调用:

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

资料来源:amirsahib


这是一个答案,但是,Y。我不推荐。两次骇客并没有取得成功。微软的序列化是一个令人讨厌的黑客。
Suncat2000

@ Suncat2000这是怎么回事?如果您正在使用一种服务来从服务器到前端检索值,那么我不知道有什么更好的选择。这是此页面上问题的最干净的解决方案。如果您知道更好的选择,请为我们举个例子吗?
Kajbo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.