[c#] 자바 스크립트 날짜에 대한 DateTime

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 날짜까지?



답변

시험:

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;

두 날짜가 동일한 시간대에있는 한 두 번째 생각으로는 중요하지 않습니다.


답변

JavaScript Date 생성자는 Unix epoch (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);
   }
}

자바 스크립트 사용 :

var dt = new Date(<%= DateTime.Today.ToJavaScriptMilliseconds() %>);
alert(dt);


답변

작업에서 이것을 시도 할 수 있습니다.

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


답변

함께 Moment.js 단순히 사용

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

netDateTimeDateTime 변수는 어디에 직렬화되어 있습니까 "/Date(1456956000000+0200)/"?


답변

이것은 트릭을 수행해야합니다.

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


답변

나는 이것이 조금 늦었다는 것을 알고 있지만 여기에 시간대에 독립적이기를 원할 때 날짜를 처리하기 위해 생각해 낸 해결책이 있습니다. 기본적으로 모든 것을 UTC로 변환하는 작업이 포함됩니다.

자바 스크립트에서 서버로 :

시간대 오프셋이 제거 된 epoch 값으로 날짜를 보냅니다.

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

그런 다음 서버는 날짜 epoch로 1420070400000을 수신합니다.

서버 측에서 해당 epoch 값을 datetime 객체로 변환합니다.

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

이 시점에서 날짜는 사용자가 제공 한 날짜 / 시간입니다. 사실상 UTC입니다.

다른 길로 가기 :

서버가 데이터베이스에서 데이터를 가져올 때 (아마도 UTC로) 차이를 epoch로 가져옵니다 (두 날짜 개체가 모두 로컬 또는 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;

자바 스크립트가이 값을 받으면 새 날짜 개체를 만듭니다. 그러나이 날짜 객체는 현지 시간으로 간주되므로 현재 시간대로 오프셋해야합니다.

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)

내가 아는 한, 이것은 시간대에 독립적 인 날짜를 표시해야하는 모든 시간대에서 작동합니다.


답변

이 방법은 저에게 효과적입니다.

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