【问题标题】:I know there must be an easier way to do this: Javascript function model returning a date我知道必须有一种更简单的方法来做到这一点:Javascript function model returned a date
【发布时间】:2012-07-25 22:47:14
【问题描述】:

我不得不说,我根本不是 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 和结束)不作为 Javascript 日期对象返回?即使在那个 wijmoEventModel 中调试肯定有日期作为 JS 日期对象??

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

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

大卫。

【问题讨论】:

    标签: javascript jquery date epoch wijmo


    【解决方案1】:

    在 jsonDate 函数中,d 的 setMilliseconds 属性(不是 d 本身)将是一个日期,您可以从 wijmoEventModel.start.d 调用它。你实际上想要var d = new Date(parseInt(rawDate.substr(6)))。 (或者你想要var d = new Date(parseInt(rawDate.split('+')[0]))?)

    【讨论】:

      【解决方案2】:

      设置毫秒只设置日期的毫秒部分,它不设置从纪元开始的日期。

      javascript 日期对象的核心是自 1970 年 1 月 1 日 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);
      

      或者上面的一些变体。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-28
        • 1970-01-01
        • 2017-05-13
        • 2018-01-11
        • 1970-01-01
        相关资源
        最近更新 更多