1

つまり、API コントローラーと結果を使用する Javascript の間で、Date が素敵なNaN

私の質問は、この長いチェーンをどこで、おそらくどのように修正することをお勧めするかということです。

ステップ 1: LINQ を使用してデータベースからオブジェクトを取得する

return _dbContext.Points.Where(
    point => point.AccountId == account.AccountId)
    .OrderBy(point => point.EarnedOn).ToList();

ここで変更を加えるのは不合理に思えます。このモデルは DateTime フィールドを指定しているため、実際には文字列とのやり取りはありません。

ステップ 2: API コントローラーが応答を送信する

var points = _pointRepository.GetByUserName(userName);
return Request.CreateResponse(HttpStatusCode.OK, points);

ここで日付を解析する方法を指定できますか? サーバー側で処理することさえ理にかなっていますか? 次のように、すべてのオブジェクトをループして手動で設定できると思います。

 for (var i = 0; i < points.Count(); i++ )
 {
     points.ElementAt(i).EarnedOn =  points.ElementAt(i).EarnedOn.ToUniversalTime();
 }

しかし、複数の列挙について話してください!

ステップ 3: クライアントは JSON データを解析して JS オブジェクトに変換し、Date を文字列から int に解析します。 読みやすくするために大幅に短縮されています。

var points = JSON.parse(response);
for(i = 0; i < points.length; i++){
    var date = Date.parse(points[i].EarnedOn);

この時点で、私にできることは限られています。ステップ 2 の最後で既に日付を文字列に変換していますが、ターゲットにしているブラウザーは、C# の既定のDateTime.toString形式を使用する方法を認識していません (それが送信されていると思います)。一部のブラウザでは動作しますが、他のブラウザではNaN.

長い説明で申し訳ありませんが、修正を適用する場所と方法を誰かが指摘できれば幸いです。

====更新====

問題のブラウザは、Android のストック ブラウザです。これは、携帯電話と BlueStacks エミュレーターの両方でテストしました。どちらも最新で、どちらでも動作しません。それはChromeで動作します。

その時の JSON 出力 (他のすべてのデータを切り取ったもの) は次のようになります。

"EarnedOn":"2012-05-10T00:00:00" 
4

2 に答える 2

0

.Net の DateTime をタイムスタンプ/秒に変換するのはどうですか。JavaScript での日付オブジェクトへの変換。ただし、モバイル ブラウザーでテストしていないため、100% 動作するとは限りません。

DateTime myDateTime = new DateTime(2012, 01, 17, 9, 30, 0);

long ticks = (myDateTime - DateTime.Parse("01/01/1970 00:00:00")).Ticks;
ticks /= 10000000; //Convert ticks to seconds
var timestamp = ticks.ToString();

次に、JavaScriptでは、次のようなもの

secsToTime = function(theSecs)
{
    var date = new Date(theSecs*1000);
    // hours part from the timestamp

    var hours = date.getHours();
    // minutes part from the timestamp
    var minutes = date.getMinutes();
    // seconds part from the timestamp
    var seconds = date.getSeconds();

    // will display time in 10:30:23 format
    var formattedTime = hours + ':' + minutes + ':' + seconds;
    alert(formattedTime);
}

secsToTime(1326792600);
于 2012-07-17T17:14:04.000 に答える
0

私は当初、Date.js を使用すると言いましたが、少しグーグルで調べたところ、2007 年以降コミットされておらず、バグだらけであることがわかりました。さらに、それはまったく正しく機能しませんでした。

今のところ、適切な解決策を探すのにうんざりしていて、ステップ 3の次の Javascript コードで動作するようになりました。

function parseDate(date){
    var year = parseInt(date.substring(0,4));
    var month = parseInt(date.substring(5,7));
    var day = parseInt(date.substring(8,10));
    var hour = parseInt(date.substring(11,13));
    var minute = parseInt(date.substring(14,16));
    var second = parseInt(date.substring(17,19));
    return new Date(year, month, day, hour, minute, second);
}

for(i = 0; i < points.length; i++){
    var date = Date.parse(points[i].EarnedOn);
    ...

これは本当にかなり醜いですが、それは答えなので、ここに入れています。誰かが来て、これよりもエレガントなものを見つけてくれることを本当に願っています.

于 2012-07-17T19:37:22.543 に答える