ASP.NET MVC JsonResult日付形式


248

モデルのJsonResultを効果的に返すコントローラーアクションがあります。だから、私の方法では次のようなものがあります:

return new JsonResult(myModel);

これは、1つの問題を除いて、うまく機能します。モデルには日付プロパティがあり、これは次のようにJson結果で返されるようです:

"\/Date(1239018869048)\/"

必要な形式で返されるように日付をどのように処理する必要がありますか?または、この形式をスクリプトでどのように処理しますか?


私はjson netの結果を同じ問題に投稿しました。日付をISO形式に変換するので、作業がはるかに簡単になります。 stackoverflow.com/questions/15778599/…–
キーラン

以下のリンクをご覧ください。ストレートフォワード。stackoverflow.com/a/60392503/5962626
Mohamedasiq

回答:


195

casperOneの答えさらに詳しく説明します

JSONの仕様は、日付の値を考慮していません。MSは呼び出しを行う必要があり、選択したパスは文字列のJavaScript表現の小さなトリックを利用することでした。文字列リテラル「/」は「\ /」と同じで、文字列リテラルは決して「」にシリアル化されん。 \ / "(" \ / "でも" \\ / "にマップする必要があります)。

詳しい説明については、http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2を参照してください(「JavaScriptリテラルからJSONへ」にスクロールダウン)

JSONの悲惨な点の1つは、日付/時刻リテラルがないことです。多くの人は、JSONに初めて遭遇したときにこれを学ぶことに驚いて失望しています。日付/時刻リテラルが存在しないことの単純な説明(慰めかどうか)は、JavaScriptがどちらも持たなかったことです。JavaScriptでの日付と時刻の値のサポートは、完全にDateオブジェクトを通じて提供されます。したがって、JSONをデータ形式として使用するほとんどのアプリケーションは、日付と時刻の値を表すために文字列または数値を使用する傾向があります。文字列を使用する場合は、通常、ISO 8601形式であることが期待できます。代わりに数値が使用されている場合、その値は通常、エポック以降の協定世界時(UTC)でのミリ秒数を意味します。エポックは1970年1月1日(UTC)の午前0時と定義されています。再び、これは単なる規約であり、JSON標準の一部ではありません。別のアプリケーションとデータを交換する場合は、そのドキュメントをチェックして、JSONリテラル内で日付と時刻の値をエンコードする方法を確認する必要があります。たとえば、MicrosoftのASP.NET AJAXは、説明されている規則のいずれも使用しません。むしろ、.NET DateTime値をJSON文字列としてエンコードします。文字列の内容は/ Date(ticks)/であり、ticksはエポック(UTC)からのミリ秒を表します。したがって、1989年11月29日、午前4時55分30秒、UTCは「\ / Date(628318530718)\ /」としてエンコードされます。NET AJAXは、説明されている規則のいずれも使用しません。むしろ、.NET DateTime値をJSON文字列としてエンコードします。文字列の内容は/ Date(ticks)/であり、ticksはエポック(UTC)からのミリ秒を表します。したがって、1989年11月29日、午前4時55分30秒、UTCは「\ / Date(628318530718)\ /」としてエンコードされます。NET AJAXは、説明されている規則のいずれも使用しません。むしろ、.NET DateTime値をJSON文字列としてエンコードします。文字列の内容は/ Date(ticks)/であり、ticksはエポック(UTC)からのミリ秒を表します。したがって、1989年11月29日、午前4時55分30秒、UTCは「\ / Date(628318530718)\ /」としてエンコードされます。

解決策はそれを解析することです:

value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10));

ただし、シリアライザにDateTimeオブジェクトを出力させる設定がどこかにあると聞きましたnew Date(xxx)構文を使用。掘り下げてみます。


の2番目のパラメーター JSON.parse()は、reviver返される前に、値が最初にどのように生成されるかを規定する関数受け入れ。

次に日付の例を示します。

var parsed = JSON.parse(data, function(key, value) {
  if (typeof value === 'string') {
    var d = /\/Date\((\d*)\)\//.exec(value);
    return (d) ? new Date(+d[1]) : value;
  }
  return value;
});

JSON.parse()のドキュメントを参照してください


1
ありがとう、解析はどこに行くのでしょうか?
ジョンアーチウェイ

私が投稿したコードはJavaScriptです。あなたはそれをあなたのクライアントコードに入れます。
JPot 2009

6
jsを短縮して新しいDate(parseInt(dateString.replace(/ \ / Date \((\ d +)\)\ // gi、 "$ 1")))
kͩeͣmͮpͥͩSep

6
実際、正規表現はreplace(/ \ / Date \((-?\ d +)\)\ // gi、 "$ 1")としてより正確です。これは、日付も-ve数値として表される可能性があるためです
Dokie

1
@HarshilShahこれはの2番目の引数ですparseInt()。これは、基数10の数値システムで整数を抽出するように関数に指示します。基数です。8そこに入れると、8進数が抽出されます。
AnalogWeapon 2017年

99

これがJavascriptでの私の解決策です-JPotのそれに非常に似ていますが、より短いです(そしておそらく少し高速です):

value = new Date(parseInt(value.substr(6)));

"value.substr(6)"は "/ Date("の部分を取り、parseInt関数は末尾にある数字以外の文字を無視します。

編集:基数(parseIntの2番目の引数)を意図的に省略しています。見る私のコメントをて。また、ISO-8601の日付はこの古い形式よりも優先されることに注意してください。そのため、この形式は通常、新しい開発には使用しないでください。優れたJson.NETをご覧くださいISO-8601形式を使用して日付をシリアル化する優れた代替策ライブラリを。

ISO-8601形式のJSON日付の場合、文字列をDateコンストラクターに渡すだけです。

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support

1
+1私はあなたの簡単な解決策をとり、それを再帰的な関数に入れました。こちらを参照してください:danielsadventure.info/dotnetdatetime
ビビアンリバー

7
parseIntを使用する場合は、常に基数を指定する必要があります。[ソース]:developer.mozilla.org/en-US/docs/JavaScript/Reference/...
ジョンZabroski

6
@JohnZabroski:すべてのルールには例外があります。.NET日付シリアライザーは先行ゼロを持つ整数を返すことないため、基数を安全に除外できます。
ロイ・ティンカー

4
ほぼ同じことがありました。value.substr(6, 13)他の非数字文字を削除するために使用しました。ただし、その場合、1938年4月26日より前の日付はすべて無効になります。parseInt数字以外の文字を無視することは知らなかった。ありがとう!
Ralph Jansen 2014年

2
@JohnZabroski- ECMAScript ed 5(2011)以降parseInt、先行ゼロは無視されます。
RobG 2017

69

クライアント側で処理するにはかなりの答えがありますが、必要に応じて出力サーバー側を変更できます。

これにはいくつかの方法があります。基本から始めましょう。JsonResultクラスをサブクラス化し、ExecuteResultメソッドをオーバーライドする必要があります。そこから、シリアル化を変更するためにいくつかの異なるアプローチを取ることができます。

アプローチ1: デフォルトの実装ではJsonScriptSerializerを使用します。ドキュメントを見ると、RegisterConvertersメソッドを使用してカスタムJavaScriptConvertersを追加できます。ただし、これにはいくつかの問題があります。JavaScriptConverterはディクショナリにシリアル化します。つまり、オブジェクトを受け取り、Jsonディクショナリにシリアル化します。それは牛車のビットを必要とする文字列にオブジェクトのシリアル化を行うために、参照のポストを。この特定のハックも文字列をエスケープします。

public class CustomJsonResult : JsonResult
{
    private const string _dateFormat = "yyyy-MM-dd HH:mm:ss";

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!String.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            // Use your custom JavaScriptConverter subclass here.
            serializer.RegisterConverters(new JavascriptConverter[] { new CustomConverter });

            response.Write(serializer.Serialize(Data));
        }
    }
}

アプローチ2(推奨): 2番目のアプローチは、オーバーライドされたJsonResultから開始して、別のJsonシリアライザー(私の場合はJson.NETシリアライザー)を使用することです。これはアプローチ1のハッカーを必要としません。JsonResultサブクラスの実装は次のとおりです。

public class CustomJsonResult : JsonResult
{
    private const string _dateFormat = "yyyy-MM-dd HH:mm:ss";

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!String.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            // Using Json.NET serializer
            var isoConvert = new IsoDateTimeConverter();
            isoConvert.DateTimeFormat = _dateFormat;
            response.Write(JsonConvert.SerializeObject(Data, isoConvert));
        }
    }
}

使用例:

[HttpGet]
public ActionResult Index() {
    return new CustomJsonResult { Data = new { users=db.Users.ToList(); } };
}

追加クレジット: James Newton-King


また、通貨、識別番号、電話など、他の形式についてはどうですか?ModelMetadataからこれらの形式を取得し、それらを使用してモデルをJsonにシリアル化するためのより良い方法ではありませんか?どうやって ?
Luciano

1
これが最良の解決策です(生鮮食品のDaveの答え)。サーバーは、正しい日付形式を提供する責任があります。また、カスタムJsonResultを使用すると、さらに多くの利点と制御が得られます。データでJsonResultをインスタンス化する「Json(data)」が存在するため、CustomJsonResultをインスタンス化するヘルパーメソッド「CustomJson(data)」を実装することをお勧めします。
スポーツ

2
これらのアプローチのいずれかを使用する場合は、1つの修正が必要です。最初の行は次のようになります。privateconst string _dateFormat = "yyyy-MM-ddTHH:mm:ss"; 「T」を追加しました。
Dominick

31

Moment.jsは、これもサポートする拡張日時ライブラリです。http://momentjs.com/docs/#/parsing/asp-net-json-dates/

例:moment( "/ Date(1198908717056-0700)/")

役立つかもしれません。プランカー出力


最初にmoment.jsファイルをダウンロードします。moment("json_date_string_value").format('appropriate format'); momet.jsページでさまざまな形式の値を確認できるので、プロジェクトに追加してください
Harshil Shah

20

私は、新しいを作成することを発見JsonResultし、それを返すことは不十分である-にすべてのコールを交換することreturn Json(obj)return new MyJsonResult { Data = obj }痛みです。


だから私は、なぜ単にハイジャックではない、考え出しJsonResult使用してActionFilter

public class JsonNetFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Result is JsonResult == false)
        {
            return;
        }

        filterContext.Result = new JsonNetResult(
            (JsonResult)filterContext.Result);
    }

    private class JsonNetResult : JsonResult
    {
        public JsonNetResult(JsonResult jsonResult)
        {
            this.ContentEncoding = jsonResult.ContentEncoding;
            this.ContentType = jsonResult.ContentType;
            this.Data = jsonResult.Data;
            this.JsonRequestBehavior = jsonResult.JsonRequestBehavior;
            this.MaxJsonLength = jsonResult.MaxJsonLength;
            this.RecursionLimit = jsonResult.RecursionLimit;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            var isMethodGet = string.Equals(
                context.HttpContext.Request.HttpMethod, 
                "GET", 
                StringComparison.OrdinalIgnoreCase);

            if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet
                && isMethodGet)
            {
                throw new InvalidOperationException(
                    "GET not allowed! Change JsonRequestBehavior to AllowGet.");
            }

            var response = context.HttpContext.Response;

            response.ContentType = string.IsNullOrEmpty(this.ContentType) 
                ? "application/json" 
                : this.ContentType;

            if (this.ContentEncoding != null)
            {
                response.ContentEncoding = this.ContentEncoding;
            }

            if (this.Data != null)
            {
                response.Write(JsonConvert.SerializeObject(this.Data));
            }
        }
    }
}

これは、JsonResultJSON.Netを使用するためにを返す任意のメソッドに適用できます。

[JsonNetFilter]
public ActionResult GetJson()
{
    return Json(new { hello = new Date(2015, 03, 09) }, JsonRequestBehavior.AllowGet)
}

これで応答します

{"hello":"2015-03-09T00:00:00+00:00"}

望んだ通りに!


isリクエストごとに比較を呼び出すことを気にしない場合は、これを以下に追加できますFilterConfig

// ...
filters.Add(new JsonNetFilterAttribute());

そして、すべてのJSONが組み込みではなくJSON.Netでシリアル化されJavaScriptSerializerます。


これは、奇妙なJavaScriptをインライン化せずに、確実なアプローチを提供する唯一の回答です(グローバルまたは粒度に設定できます)。2回賛成できますか?
T-moty

19

jQueryを使用して日付を自動変換する $.parseJSON

:この回答は、自動ISOおよび.net日付形式のサポートを追加するjQuery拡張機能を提供します。

Asp.net MVCを使用しているので、クライアント側でjQueryを使用していると思います。日付を自動的に変換するために使用するコードを含むこのブログ投稿を読むことをお勧め$.parseJSONします。

コードは、あなたが言及したようなAsp.net形式の日付とISO形式の日付をサポートします。を使用すると、すべての日付が自動的にフォーマットされます$.parseJSON()


2
最初は、このアプローチがうまく機能していると思いました。($ .ajaxSetup()でコンバーターを登録する方法については、記事の最後にあるコメントを参照してください)ただし、このソリューションの大きな欠点は、Epoc(1970)の前の日付をサポートしていないことです。 .asmxファイルをあきらめて、日付をより適切にフォーマットする(JSON.NETを使用して)WebAPIに切り替えることで、このすべての問題を回避することにしました。
ClearCloud8 2014年

11

クライアントとサーバー間のAjax通信には、多くの場合、JSON形式のデータが含まれます。JSONは文字列、数値、およびブール値に対して適切に機能しますが、ASP.NETがシリアル化する方法が原因で、日付に対していくつかの問題を引き起こす可能性があります。日付の特別な表現がないため、プレーンな文字列としてシリアル化されます。ソリューションとして、ASP.NET WebフォームとMVCのデフォルトのシリアル化メカニズムは、特殊な形式で日付をシリアル化します-/ Date(ticks)/-ここで、ticksは1970年1月1日からのミリ秒数です。

この問題は2つの方法で解決できます。

クライアント側

受け取った日付文字列を数値に変換し、目盛りをパラメーターとして日付クラスのコンストラクターを使用して日付オブジェクトを作成します。

function ToJavaScriptDate(value) {
  var pattern = /Date\(([^)]+)\)/;
  var results = pattern.exec(value);
  var dt = new Date(parseFloat(results[1]));
  return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();
}

サーバ側

前のソリューションでは、クライアント側のスクリプトを使用して日付をJavaScriptのDateオブジェクトに変換しました。.NET DateTimeインスタンスを任意の形式でシリアル化するサーバー側コードを使用することもできます。このタスクを実行するには、独自のActionResultを作成し、必要な方法でデータをシリアル化する必要があります。

参照:http : //www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html


7

同じ問題があり、実際の日付値を返す代わりに、ToString( "dd MMM yyyy")を使用しました。次に、JavaScriptで新しいDate(datevalue)を使用しました。datevalueは「01 Jan 2009」の場合があります。


1
これにはもっと多くの賛成票があるはずです。それは少なくとも最も支持されているものと同じくらい良いです。弦を切るよりも少しエレガント。個人的には、これを使用しましたが、表示する必要があるため、フロントエンドで日付オブジェクトを再作成しなかったため、(わずかに異なる)形式の文字列を表示しました。ヒントをありがとう、@ Joe!
vbullinger 2012

1
それは、懸念の分離、つまり、日付がフロントエンドでどのように表示されるかという懸念をバックエンドに置くことを壊します。しかし、まあ、それはまだよりエレガントです。
A.マレー

1
のような壊れにくいものを使用してみませんToString("o")か?
binki

"dd MMM yyyy"はECMA-262ではサポートされていないため、組み込みのパーサーがそれを解析することは期待できません
RobG

3

このスレッドを参照してください:

http://forums.asp.net/p/1038457/1441866.aspx#1441866

基本的に、Date()フォーマットは有効なJavaScriptですが、有効なJSONではありません(違いがあります)。古い形式が必要な場合は、ファサードを作成して値を自分で変換するか、または型のシリアライザJsonResultで日付のカスタム形式を使用する方法を見つける必要があります。


「新しいDate()形式が有効なJavaScriptである間」[「新しい」キーワードに注意]という意味ですか?
JPot 2009

2

最もエレガントな方法ではありませんが、これは私にとってうまくいきました:

var ms = date.substring(6, date.length - 2);
var newDate = formatDate(ms);


function formatDate(ms) {

    var date = new Date(parseInt(ms));
    var hour = date.getHours();
    var mins = date.getMinutes() + '';
    var time = "AM";

    // find time 
    if (hour >= 12) {
        time = "PM";
    }
    // fix hours format
    if (hour > 12) {
        hour -= 12;
    }
    else if (hour == 0) {
        hour = 12;
    }
    // fix minutes format
    if (mins.length == 1) {
        mins = "0" + mins;
    }
    // return formatted date time string
    return date.getMonth() + 1 + "/" + date.getDate() + "/" + date.getFullYear() + " " + hour + ":" + mins + " " + time;
}

2

上記の回答のどれも本当に役に立たなかったので、私はこの問題の解決に取り組んでいます。私はjqueryの週のカレンダーを使用していて、サーバーとページのローカルにタイムゾーン情報を取得するために日付が必要でした。かなり掘り下げた後、私は他の人を助けるかもしれない解決策を見つけました。

私はasp.net 3.5、vs 2008、asp.net MVC 2、jquery週カレンダーを使用しています。

まず、クライアント側で日付を処理するのに役立つ、Steven Levithanが作成したライブラリー、Steven Levithanの日付ライブラリーを使用しています。isoUtcDateTime形式は、必要なものに最適です。私のjquery AJAX呼び出しでは、isoUtcDateTime形式のライブラリで提供されるformat関数を使用し、ajax呼び出しがアクションメソッドに到達すると、datetime Kindがローカルに設定され、サーバー時間を反映します。

AJAX経由でページに日付を送信するとき、「ddd、dd MMM yyyy HH ':' mm ':' s 'GMT'zzzz」を使用して日付をフォーマットすることにより、テキスト文字列として送信します。このフォーマットは、クライアント側を使用して簡単に変換されます

var myDate = new Date(myReceivedDate);

以下は、私の完全なソリューションからダウンロードしたSteve Levithanのソースを除いたものです。

コントローラ:

public class HomeController : Controller
{
    public const string DATE_FORMAT = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'zzzz";

    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }


    public JsonResult GetData()
    {
        DateTime myDate = DateTime.Now.ToLocalTime();

        return new JsonResult { Data = new { myDate = myDate.ToString(DATE_FORMAT) } };
    }

    public JsonResult ReceiveData(DateTime myDate)
    {
        return new JsonResult { Data = new { myDate = myDate.ToString(DATE_FORMAT) } };
    }
}

JavaScript:

<script type="text/javascript">

function getData() {
    $.ajax({
        url: "/Home/GetData",
        type: "POST",
        cache: "false",
        dataType: "json",
        success: function(data) {
            alert(data.myDate);
            var newDate = cleanDate(data.myDate);
            alert(newDate);
            sendData(newDate);
        }
    });
} 

function cleanDate(d) {
    if (typeof d == 'string') {
        return new Date(d) || Date.parse(d) || new Date(parseInt(d));
    }
    if (typeof d == 'number') {
        return new Date(d);
    }
    return d;
}

function sendData(newDate) {
    $.ajax({
        url: "/Home/ReceiveData",
        type: "POST",
        cache: "false",
        dataType: "json",
        data:
        {
            myDate: newDate.format("isoUtcDateTime")
        },
        success: function(data) {
            alert(data.myDate);
            var newDate = cleanDate(data.myDate);
            alert(newDate);
        }
    });
}

// bind myButton click event to call getData
$(document).ready(function() {
    $('input#myButton').bind('click', getData);
});
</script>

この簡単な例が、私と同じ状況で他の人を助けてくれることを願っています。現時点では、Microsoft JSONシリアライゼーションと非常にうまく機能し、タイムゾーン全体で日付を正確に保ちます。


日付の形式を指定できる場合は、ECMA-262がサポートを必要とする唯一の形式であるため、ISO 8601拡張を使用する必要があります。
RobG 2017

2

knockoutjsで日付を処理するためのより良い方法は、モーメントライブラリを使用してボスのような日付を処理することです。/ Date(-62135578800000)/のような日付を簡単に処理できます。コントローラーで日付をシリアル化する方法を気にする必要はありません。

function jsonToDate(date,format) {
   return moment(date).format(format);
}

好きに使う

var formattedDate = jsonToDate(date,'MM/DD/YYYY')

momentjsは、日付の多くの日時形式とユーティリティ関数をサポートしています。


1

クエリ内の日付をフォーマットします。

var _myModel = from _m in model.ModelSearch(word)
    select new { date = ((DateTime)_m.Date).ToShortDateString() };

このソリューションの唯一の問題は、日付値のいずれかがnullの場合、結果が得られないことです。これを回避するには、日付のnullを無視する日付を選択する前にクエリに条件ステートメントを配置するか、クエリを設定してすべての結果を取得し、foreachループを使用してそのすべての情報をループし、値を割り当てることができます。新しいSELECTを実行する前にnullであるすべての日付に。

両方の例:

var _test = from _t in adc.ItemSearchTest(word)
                        where _t.Date != null
                        select new { date = ((DateTime)_t.Date).ToShortDateString() };

2番目のオプションでは、すべてのnullに値を割り当てることができるように、完全に別のクエリが必要です。これとforeachループは、値を選択するクエリの前にある必要があります。

var _testA = from _t in adc.ItemSearchTest(word)
                         select _i;

            foreach (var detail in _testA)
            {
                if (detail.Date== null)
                {
                    detail.Date= Convert.ToDateTime("1/1/0001");
                }
            }

すべてのjavascriptの例よりも簡単だと思ったアイデア。


1

この方法を使用できます。

String.prototype.jsonToDate = function(){
    try{
        var date;
        eval(("date = new " + this).replace(/\//g,''));
        return date;
    } 
    catch(e){
        return new Date(0);
    }
};

1

0

あなたのcshtmlでは、

<tr ng-repeat="value in Results">                
 <td>{{value.FileReceivedOn | mydate | date : 'dd-MM-yyyy'}} </td>
</tr>

あなたのJSファイルでは、おそらくapp.js、

app.controllerの外に、以下のフィルターを追加します。

ここで「mydate」は、日付を解析するために呼び出す関数です。ここで「アプリ」は、angular.moduleを含む変数です。

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

これはangularjsに非常に特有であり、すべての人が使用するわけではありませんが、これは私にとってはうまくいきました、ありがとう。
Lauro182

0

ページにjquery uiプラグインを追加します。

function JsonDateFormate(dateFormate, jsonDateTime) {
    return $.datepicker.formatDate(dateFormate, eval('new ' + jsonDateTime.slice(1, -1)));
};

0

何のためでもありませんが、別の方法があります。まず、LINQクエリを作成します。次に、列挙結果のクエリを作成し、機能するフォーマットの種類を適用します。

var query = from t in db.Table select new { t.DateField };
var result = from c in query.AsEnumerable() select new { c.DateField.toString("dd MMM yyy") };

余計な手順は面倒ですが、うまく機能します。


0

私にとってうまくいったのは、日付プロパティを文字列として含むビューモデルを作成することでした。ドメインモデルからDateTimeプロパティを割り当て、viewmodelに値を割り当てる際に、dateプロパティで.ToString()を呼び出します。

MVCアクションメソッドからのJSON結果は、ビューと互換性のある形式で日付を返します。

モデルを見る

public class TransactionsViewModel
{
    public string DateInitiated { get; set; }
    public string DateCompleted { get; set; }
}

ドメインモデル

public class Transaction{
   public DateTime? DateInitiated {get; set;}
   public DateTime? DateCompleted {get; set;}
}

コントローラーアクションメソッド

public JsonResult GetTransactions(){

var transactions = _transactionsRepository.All;
        var model = new List<TransactionsViewModel>();

        foreach (var transaction in transactions)
        {
            var item = new TransactionsViewModel
            {
                ...............
                DateInitiated = transaction.DateInitiated.ToString(),
                DateCompleted = transaction.DateCompleted.ToString(),
            };

            model.Add(item);
        }
        return Json(model, JsonRequestBehavior.AllowGet);
}


0

迷惑ですね。

私の解決策は、より読みやすい(Microsoft以外の)形式でDateTimesを返すようにWCFサービスを変更することでした。以下に注意してください。「UpdateDateOriginal」はWCFのデフォルトの日付形式で、「UpdateDate」はより読みやすい形式になっています。

ここに画像の説明を入力してください

方法は次のとおりです。

WCF日付形式の変更

お役に立てれば。


0

これがサーバー側を変更する最も簡単な方法であることがわかりました。

using System.Collections.Generic;
using System.Web.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;

namespace Website
{
    /// <summary>
    /// This is like MVC5's JsonResult but it uses CamelCase and date formatting.
    /// </summary>
    public class MyJsonResult : ContentResult
    {
        private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            Converters = new List<JsonConverter> { new StringEnumConverter() }
        };

        public FindersJsonResult(object obj)
        {
            this.Content = JsonConvert.SerializeObject(obj, Settings);
            this.ContentType = "application/json";
        }
    }
}

0

JSONの日付でいくつかの問題が発生し、SQLで日付の問題に対処することで問題を取り除くことにしました。日付形式を文字列形式に変更します

select flddate from tblName

select flddate, convert(varchar(12), flddate, 113) as fldDateStr from tblName

fldDateStrを使用することで問題は消え、ソートやその他の目的で日付フィールドを使用できました。


0

サーバーの日付形式を返します。独自の関数を定義する必要があります。

function jsonDateFormat(jsonDate) {
  // Changed data format;
  return (new Date(parseInt(jsonDate.substr(6)))).format("mm-dd-yyyy / h:MM tt");
};

0

<input type="date">ASP.NET MVCから渡された日付から値を設定するJavaScriptコードを次に示します。

var setDate = function(id, d) {
  if (d !== undefined && d !== null) {
    var date = new Date(parseInt(d.replace("/Date(", "").replace(")/", ""), 10));
    var day = ('0' + date.getDate()).slice(-2);
    var month = ('0' + (date.getMonth() + 1)).slice(-2);
    var parsedDate = date.getFullYear() + "-" + (month) + "-" + (day);
    $(id).val(parsedDate);
  }
};

この関数は次のように呼び出します。

setDate('#productCommissionStartDate', data.commissionStartDate);

commissionStartDateMVCによって渡されるJSON日付はどこにありますか。


-1

最も簡単なもの:

var milisegundos = parseInt(data.replace( "/ Date("、 "").replace( ")/"、 ""));
Var newDate = new Date(milisegundos)。toLocaleDateString( "en-UE");

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.