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 Dateへ?


このようなajax関連の質問では、変換を行う場所を指定する必要があります。また、JSONには日付のシリアル化の標準がないこと、および/ Date(02020202などのMS日付の変更に対処している可能性があることを考慮してください。 )/明確にすることも忘れないでください。幸運
スカイサンダーズ

2
あなたが言及している答えをリンクする必要があります
cdmckay 2014年

回答:


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;

ただし、2番目の考えでは、両方の日付が同じタイムゾーンにある限り、問題ではありません。


5
DateTime.Nowの代わりにDateTime.UtcNowを使用することもできます
Matt Dearing

2
あなたの第二の考えに関して:それは夏時間への、または夏時間からの移行の間に重要です(私は常にどれを覚えているか本当に本当に考えなければなりません:)。移行中、2:00から3:00の時間は2回繰り返されます。つまり、1時間の間、JavaScriptの日付が1時間ずれます。UTCにはDLSがないため、その問題はありません。
Sebastiaan M

ここには同じコードがありますが、C#の日付が正常に機能する一方で、JavaScriptの日付に5:30の違いがあります。
Jenish Zinzuvadiya 2016

44

JavaScript Dateコンストラクターは、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);

C#の使用法長い日付= 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 plus C#)

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

1
簡単かつ迅速に理解される
FindOutIslamNow 2018

ベストアンサー
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からサーバーへ

日付を、タイムゾーンオフセットを削除したエポック値として送信します。

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がこの値を受け取ったら、新しい日付オブジェクトを作成します。ただし、この日付オブジェクトは現地時間と見なされるため、現在のタイムゾーンでオフセットする必要があります。

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:jsの月番号を修正するための月の-1。

幸運を


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


それは答えですが、ヤック。お勧めしません。2つのハックは正しくありません。そして、マイクロソフトのシリアライゼーションは不愉快なハックです。
Suncat2000

@ Suncat2000このハックはどうですか?サーバーからフロントエンドに値を取得するためのサービスを使用している場合、これ以上の代替手段はありません。これは、このページの問題の最も明確な解決策です。より良い代替案を知っている場合は、例を示してください。
Kajbo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.