2

日付の操作に問題があります。

日付フィールドを持つオブジェクトがあります:

public DateTime FechaInicio {get; セットする;}

この定義により、データベースに次のフィールドが生成されます。

FechaInicio日時はnullではありません

Webサービスにリクエストを送信すると、次の形式で日付が(JSONで)取得されます。

"FechaInicio": "1982-12-02T00:00:00"

また、エンティティでFechaInicio()を呼び出すと、javascriptのDateオブジェクトが返されます。

新しいエンティティを作成すると、次の値が得られます。

createPalanca var = function () {
    MetadataStore var = manager.metadataStore;
    metadataStore.getEntityType palancaType = var ("Toggle");
    palancaType.createEntity newPalanca = var ();
    manager.addEntity (newPalanca);

    //Here: newPalanca.FechaInicio () has the value in this format: 1355313343214
    //Expected Date object here
    newPalanca return;
};

結局のところ、私の本当の質問は、日付型フィールドに新しい値を割り当てるためにどの形式を使用する必要があるかということです。

編集:

いくつかのテストを行った後、プロパティにDateオブジェクトを割り当てると、次の行に到達するまですべてが正常に見えることに気付きました。

saveBundleStringified var = JSON.stringify(saveBundle);

saveBundleのコンテンツは次のとおりです。

FechaInicio: Thu Dec 20 2012 00:00:00 GMT+0100 (Hora estándar romance)

およびsaveBundleStringified:

"FechaInicio": "2012-12-19T23:00:00.000Z" <- I guess this is utc format

最終的にデータベースに保存されるのは、2012-12-19 23:00:00.0000000です。

SaveChangesの呼び出しの結果が返されると、関数updateEntityでキャッシュ内のエンティティとマージされます。このチェックはfalseを返すif(!core.isDate(val))です。結果として、間違った日付で新しいDateオブジェクトが作成されます。

function fastDateParse(y, m, d, h, i, s, ms){ //2012 12 19 23 00 00 ""
    return new Date(y, m - 1, d, h || 0, i || 0, s || 0, ms || 0);
}

私が間違っていたら訂正してください、でもそれが問題だと思います。

4

3 に答える 3

4

時間がかかってすみません...

BreezeのDateTimeタイムゾーンのシリアル化と、null許容でない日付フィールドを持つ新しく構築されたエンティティに使用されるデフォルトのDateTime値にバグがありました。これらはv0.77.2で修正されています。この一連の修正が機能するかどうかを確認してください。

そして、これらを見つけてくれてありがとう。

また、質問に答えるには、オブジェクトのすべての日付プロパティをjavascriptDatesに設定する必要があります。Breezeは、すべてのシリアル化の問題を適切に処理する必要があります。

于 2012-12-15T02:04:49.810 に答える
1

日付はいつも私を怖がらせます。私の当面の本能は、ブラウザとサーバーが同じタイムゾーン上にないということです。どうしてそれができるのか私にはわかりません。いずれにせよ、それは必ず起こることであり、私は、日時にクライアントとサーバーを調整する際のあらゆる種類の基本的な問題を思い出します。通常の推奨事項は、すべてをUTCで保持し、現地時間でユーザーに表示する内容を調整することでした。

私はむしろこれが有用な答えであるとは思えません。これを解決するためにBreezeがどのような役割を果たすべきかわかりません。私たちが回覧し、コンセンサスを構築できるという提案を歓迎します。

また、このステートメントを明確にできますか?

SaveChangesの呼び出しの結果が返されると、関数updateEntityでキャッシュ内のエンティティとマージされます。このチェックはfalseを返すif(!core.isDate(val))です。結果として、間違った日付で新しいDateオブジェクトが作成されます

「間違った日付」とはどういう意味ですか?そして、Breezeは、着信日の値が無効な形式であると考えていると言っていますか(予想した日付以外の日付ではありません)?

はい、@ Sascha、BreezeはJSONフォーマットにWeb Api標準(Json.Net)を使用しており、奇抜なMicrosoftフォーマット(これを書いているときに私を逃れる)ではなく、ISO8601フォーマットに設定されています。

于 2012-12-12T18:59:39.413 に答える
0

Breeze / Web Apiには、特別な形式(ISO8601)の日付が必要なようです。他のフォーマットは私にはうまくいきませんでした。moment.jsは、設定と読み取りに関する問題を解決しました。Knockoutを使用して特別なバインディングで日付を表示する場合も、フォーマットはうまく行われます。

entity.someDate(moment().utc().toDate()) // example

そしてそれは動作します。

これを使用することもできます:

Date.prototype.setISO8601 = function(string) {
        var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
            "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
            "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
        var d = string.match(new RegExp(regexp));

        var offset = 0;
        var date = new Date(d[1], 0, 1);

        if (d[3]) {
            date.setMonth(d[3] - 1);
        }
        if (d[5]) {
            date.setDate(d[5]);
        }
        if (d[7]) {
            date.setHours(d[7]);
        }
        if (d[8]) {
            date.setMinutes(d[8]);
        }
        if (d[10]) {
            date.setSeconds(d[10]);
        }
        if (d[12]) {
            date.setMilliseconds(Number("0." + d[12]) * 1000);
        }
        if (d[14]) {
            offset = (Number(d[16]) * 60) + Number(d[17]);
            offset *= ((d[15] == '-') ? 1 : -1);
        }

        offset -= date.getTimezoneOffset();
        time = (Number(date) + (offset * 60 * 1000));
        this.setTime(Number(time));
    };
于 2012-12-12T12:32:55.577 に答える