0

我不得不说,我根本不是 Javascript 日期方面的专家……!例如,我查看了 DateJS,但是我的问题不仅仅是简单的日期转换(或者它应该是!)。

快速背景:我有一个服务调用,它返回一些 JSON 数据,其中包括来自 WCF/REST 的可怕的 Epoch 样式日期(我现在不能使用 Webapi - 这会给我原生 JSON.NET?)。

因此 JSON 对象的日期示例是:

开始日期:“/日期(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
    }
};

所以上面的函数只是从我原始的完整 JSON 返回中选择所需的字段,并使用我的 Javascript 函数/模型返回一个新的“日历数据”JSON 对象,我可以将它与我的 Wijmo 事件日历一起使用。

还有一个小函数可以将 Epoch 样式的日期 "/Date(1343378404560+0100)/" 转换为(我认为!)一个真正的 Javascript Date 对象。像这样:

function jsonDate(rawDate) {

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

所以上面的第一个代码块当然使用了上面的小函数,希望将 Epoch 样式的原始日期转换为 Javascript 日期。

所以我的问题/问题是:

上面的模型和 jQuery 映射函数运行良好,我得到了一个完全符合我需要的结构的子集 JSON 对象,但是返回的日期(wijmoEventModel.start & end)不会作为 Javascript Date 对象返回?即使在那个 wijmoEventModel 中调试肯定有日期作为 JS 日期对象?

显然,我在这里缺少/不了解一些重要和基本的方面!!!

请!如果有人可以提供帮助,因为这让我发疯...

大卫。

4

2 回答 2

1

在 jsonDate 函数中, d 的 setMilliseconds 属性(不是 d 本身)将是一个日期,您可以从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 日期对象的核心是自 1970-01-01 00:00:00 UTC 以来的毫秒数。因此,如果您拥有的“自纪元以来的时间”相同,则如果将其转换为数字,则可以执行以下操作:

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 回答