0

私はJavascriptの日付の専門家ではないと言わざるを得ません..まったく!たとえば、DateJS を見てきましたが、私の問題は単純な日付変換だけではありません (またはそうあるべきです!)。

簡単な背景: WCF/REST から恐ろしいエポック スタイルの日付を含む JSON データを返すサービス コールがあります (現時点では Webapi を使用できません。ネイティブの JSON.NET を取得できますか?)。

したがって、JSON オブジェクトの日付の例は次のとおりです。

開始日: "/Date(1343378404560+0100)/"

呼び出しから返された JSON には、Wijmo イベント カレンダー オブジェクトに必要な情報がさらに含まれているので、Wijmo イベント オブジェクト用の Javascript 関数/モデルを作成し、jQuery MAP 関数を使用してフィールドのみを選択します。必要。

私のJavascriptイベントモデルは次のようになります:

function wijmoEventModel(in_id, in_calendar, in_subject, in_location, in_start, in_end, in_description, in_colour, in_allday, in_tag) {

    this._id = in_id;
    this._calendar = in_calendar;
    this._subject = in_subject;
    this._location = in_location;
    this._start = jsonDate(in_start);
    this._end = jsonDate(in_end);
    this._description = in_description;
    this._colour = in_colour;
    this._allday = in_allday;
    this._tag = in_tag;

    //  Public Properties/Methods
    return {
        id: this.id,
        calendar: this._calendar,
        subject: this._subject,
        location: this._location,
        start: this._start,
        end: this._end,
        description: this._description,
        color: this._colour,
        allday: this._allday,
        tag: this._tag
    }
};

したがって、jQuery MAP 関数を使用する別の小さな関数があります。

function returnWijmoCalendarObject(diaryEventData) {

    //  Using jQuery map, reduce our raw event data down to only the required wijmo calendar items
    var _calobj = $.map(diaryEventData, function (fld) {
        return new wijmoEventModel(fld.ID, fld.ResourceCalendarID, fld.EventTitle, fld.Location, fld.StartDate, fld.EndDate, fld.Description, fld.ResourceColour, fld.AllDay);
    });
    return {
        calendardata: _calobj
    }
};

SO 上記の関数は、元の完全な JSON リターンから必要なフィールドを選択するだけで、JavaScript 関数/モデルを使用して、Wijmo イベント カレンダーで使用できる新しい「calendardata」JSON オブジェクトを返します。

エポック スタイルの日付 "/Date(1343378404560+0100)/" を (私が思うに!) 実際の Javascript Date オブジェクトに変換する小さな関数がもう 1 つあります。

function jsonDate(rawDate) {

    var d = new Date();
    d.setMilliseconds = parseInt(rawDate.substr(6));
    return d;
}

したがって、上記の小さな関数はもちろん、上記の最初のコード ブロックで使用され、エポック スタイルの元の日付を Javascript の日付に変換することを期待しています。

私の質問/問題は次のとおりです。

上記のモデルと jQuery マップ関数はうまく機能し、必要な構造のサブセット JSON オブジェクトを取得しますが、返される日付 (wijmoEventModel.start & end) は Javascript の Date オブジェクトとして返されませんか?? そのwijmoEventModelでデバッグすると、JS日付オブジェクトとして日付が確実に含まれますか??

明らかに、ここでいくつかの重要で基本的な側面が欠けている/理解していません!!!

お願いします!これが私を夢中にさせているので、誰かが助けてくれるなら...

デビッド。

4

2 に答える 2

1

jsonDate 関数では、d (d 自体ではない) の setMilliseconds プロパティが日付になり、 から呼び出すことができますwijmoEventModel.start.d。あなたは実際に欲しいvar d = new Date(parseInt(rawDate.substr(6)))。(それとも欲しいvar d = new Date(parseInt(rawDate.split('+')[0]))ですか?)

于 2012-07-27T09:28:54.403 に答える
0

ミリ秒を設定すると、日付のミリ秒部分のみが設定され、エポックからの日付は設定されません。

JavaScript の日付オブジェクトの中心にあるのは、UTC で 1970-01-01 00:00:00 からのミリ秒数です。したがって、「エポックからの時間」が同じ場合、それを数値に変換すると、次のことができます。

var d = new Date( Number(millisecondsSinceEpoch) );

ECMA-262 15.9.3.2を参照

これにより、UTC の「エポックからの時間」に基づいて、ローカル タイムゾーンで日付オブジェクトが作成されます。したがって、異なるタイム ゾーンでは、UTC で同じ瞬間を表す異なる時間が表示されます。

例えば

var millisecondsSinceEpoch = '1343378404560';
alert( new Date(Number(millisecondsSinceEpoch))); //Fri Jul 27 2012 18:40:04 GMT+1000 (EST)

OP の時間は '1343378404560+0100' です。これは、hhmm であると想定するオフセットを意味します。そのため、Date に渡す前に数値から減算する必要があります。

var s = '1343378404560+0100';
var t = s.split('+')[1];

if (t) {
  t = t.substring(0,2)*3600 + t.substring(2)*60;
} else {
  t = 0;
}

var d = new Date(parseInt(s) - t * 1000);  // Fri Jul 27 2012 17:40:04 GMT+1000 (EST)

編集

上記は "+" の記号を想定しています。文字列は "+" または "-" で分割され、その後で記号が検出されて適用されます。

var t = s.split(/[-+]/)[1];

t の値を設定した後、次の符号を適用します。

t *= /-/.test(s)? -1000 : 1000;
var d = new Date(parseInt(s) - t);

または上記のいくつかのバリエーション。

于 2012-07-27T09:48:14.413 に答える