私のjson応答は次のようになります。
[{"Id":"dab4580b-e24d-49f8-9fd5-2e968b10d3b5","Title":"MVVM-Sidekick 入精","CreatedOn":"\/Date(1390272893353)\/","IsChecked":false},{"Id":"66a0f134-e240-4cc4-96fa-ac3807853ca7","Title":"Windows Phone 开发入精","CreatedOn":"\/Date(1390018447080)\/","IsChecked":false}]
「CreatedOn」の日付は次の形式です: '/ Date(1390272893353)/'
この結果をhtmlテーブルにバインドすると、日付をフォーマットできません。
<td>{{item.CreatedOn | date: 'yyyy-MM-dd HH:mm'}}</td>
まだ私に与えます:
/日付(1390272893353)/
サーバー側でコードを変更したくない(json文字列を変更しないでください)、この日付をフォーマットする最良の方法は何ですか?
1つのオプションは、別のフィルターを作成してそれをチェーンに入れることです。例えば。:
app.filter("mydate", function() {
var re = /\/Date\(([0-9]*)\)\//;
return function(x) {
var m = x.match(re);
if( m ) return new Date(parseInt(m[1]));
else return null;
};
});
基本的には、正規表現を使用して文字列を解析し、Date
を作成します(表示されている形式と異なる場合は、正規表現を微調整する必要があります)。
次のように使用します。
<td>{{item.CreatedOn | mydate | date: 'yyyy-MM-dd HH:mm'}}</td>
実際に@Charminbearと@Nikosからの回答を組み合わせて、このフィルターが完成しました。
myApp.filter("jsDate", function () {
return function (x) {
return new Date(parseInt(x.substr(6)));
};
});
これにより、
{{ $scope.item.CreatedOn | jsDate | date:"yyyy-MM-dd" }}
私はパーティーに遅れていることを知っています。しかし、私が助けてくれたことを伝えたい:-
<td>{{item.yourdatefield.slice(6,-2) | date:'dd-MMM-yyyy' }}</td>
私のような怠け者のコーダーに役立つことを願っています。 :)
Angular Date-FilterはJS-Dateを想定しています。したがって、JSON Dateを解析してからフィルターに渡す必要があります。
これを試して:
<td>{{item.CreatedOnParsed | date: 'yyyy-MM-dd HH:mm'}}</td>
そして、応答のコールバックメソッドで、次のようなことをします:
$scope.item.CreatedOnParsed = new Date(parseInt(item.CreatedOn.substr(6)));
このように Answer
[〜#〜] edit [〜#〜]投稿のコメントからわかるように、日付だけではタイムスタンプだけでも十分ですフィルター、これで十分です:
$scope.item.CreatedOnParsed = item.CreatedOn.substr(6);
//input - "DocDate":"\/Date(1127318400000-0000)\/"
-------
<tr dir-paginate="user in SalesOrder>
<td>{{user.DocDate | jsonDate}}</td>
</tr>
controller
----------
app.filter('jsonDate', ['$filter', function ($filter) {
return function (input, format) {
return (input)
? $filter('date')(parseInt(input.substr(6)), format)
: '';
};
}]);
別の、おそらくより良いオプションは、JSONを受信するときに日付を解析することです。
次の機能を使用します。
(function() {
if (JSON && !JSON.parseWithDate) {
JSON.parseWithoutDate = JSON.parse; //Store the original JSON.parse function
var reISO = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/;
var reMsAjax = /^\/Date\((d|-|.*)\)[\/|\\]$/;
JSON.parseWithDate = function (json) {
/// <summary>
/// parses a JSON string and turns ISO or MSAJAX date strings
/// into native JS date objects
/// </summary>
/// <param name="json" type="var">json with dates to parse</param>
/// </param>
/// <returns type="value, array or object" />
try {
var res = JSON.parseWithoutDate(json,
function (key, value) {
if (typeof value === 'string') {
var a = reISO.exec(value);
if (a)
return new Date(Date.UTC(+a[1], +a[2] - 1,
+a[3], +a[4], +a[5], +a[6]));
a = reMsAjax.exec(value);
if (a) {
var b = a[1].split(/[-+,.]/);
return new Date(b[0] ? +b[0] : 0 - +b[1]);
}
}
return value;
});
return res;
} catch (e) {
// orignal error thrown has no error message so rethrow with message
throw new Error("JSON content could not be parsed");
return null;
}
};
JSON.dateStringToDate = function (dtString) {
/// <summary>
/// Converts a JSON ISO or MSAJAX string into a date object
/// </summary>
/// <param name="" type="var">Date String</param>
/// <returns type="date or null if invalid" />
var a = reISO.exec(dtString);
if (a)
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3],
+a[4], +a[5], +a[6]));
a = reMsAjax.exec(dtString);
if (a) {
var b = a[1].split(/[-,.]/);
return new Date(+b[0]);
}
return null;
};
JSON.stringifyWcf = function (json) {
/// <summary>
/// Wcf specific stringify that encodes dates in the
/// a WCF compatible format ("/Date(9991231231)/")
/// Note: this format works ONLY with WCF.
/// ASMX can use ISO dates as of .NET 3.5 SP1
/// </summary>
/// <param name="key" type="var">property name</param>
/// <param name="value" type="var">value of the property</param>
return JSON.stringify(json, function (key, value) {
if (typeof value == "string") {
var a = reISO.exec(value);
if (a) {
var val = '/Date(' +
new Date(Date.UTC(+a[1], +a[2] - 1,
+a[3], +a[4],
+a[5], +a[6])).getTime() + ')/';
this[key] = val;
return val;
}
}
return value;
})
};
//Make Date parsing the default
JSON.parse = JSON.parseWithDate;
}
})();
ここから取られます: http://codepaste.net/i89xhc 、ただし、標準のJSON.parse関数を、日付を解析するこのバージョンで上書きします。これは、Angularが表示されるすべてのJSONからASMXの日付を自動的に解析することを意味します。
また、angular $ http変換を使用してカスタム変換を記述することもできます。参照: https://docs.angularjs.org/api/ng/service/ $ http
それが.net JSON日付であり、moment.jsを使用していると仮定します。次に、その機能( ここで定義済み )をフィルターに活用します
myApp.filter('JSONdate', [
'$filter', function ($filter) {
return function (input, appformat) {
if (input != null) {
return moment(input).format(appformat);
// use the line below if you want to leverage the standard date filter on top of this
// return $filter('date')(new Date(moment(input)), appformat);
} else {
return '';
}
};
}])