2013-07-25 29 views
2

如何显示Highstock中的日期的星期编号(不是Highcharts!)?Highstock - 显示周数

我的SQL看起来像这样

select unix_timestamp(date)*1000 week 
(....) 
group by yearweek(date,3) 

我的JS

$(function() { 
    $.getJSON('json_chart.php', function(data) { 

     // Create the chart 
     $('#container').highcharts('StockChart', { 


      rangeSelector : { 
       selected : 2 
      }, 

      title : { 
       text : 'Wyniki' 
      }, 
      xAxis: { 
       type: 'datetime', 
       dateTimeLabelFormats: { 
        day: '%e' 
       } 
      }, 
      yAxis: [{ 
       offset: 40, 
       title: { 
        text: 'Ilośc' 
       }, 
       lineWidth: 2 
      }, { 
       title: { 
        text: 'Efek' 
       }, 
       opposite: true, 
      }], 

      series : [{ 
       name : 'Ode', 
       data : data.ode, 
       type : 'column', 
       yAxis: 0 
      },{ 
       name : 'Sku', 
       data : data.sku, 
       marker : { 
        enabled : true, 
        radius : 3 
       }, 
       yAxis: 1, 
       shadow : true 
      },{ 
       name : 'TK', 
       data : data.tpk, 
       marker : { 
        enabled : true, 
        radius : 3 
       }, 
       yAxis: 0, 
       shadow : true 
      }] 
     }); 
    }); 
}); 

目前,它看起来像这样:

enter image description here

但我想是这样的:

enter image description here

回答

7

可以使用dateFormats添加它,例如:http://jsfiddle.net/EkAnm/

Highcharts.dateFormats = { 
    W: function (timestamp) { 
     var date = new Date(timestamp), 
      day = date.getUTCDay() == 0 ? 7 : date.getUTCDay(), 
      dayNumber; 
     date.setDate(date.getUTCDate() + 4 - day); 
     dayNumber = Math.floor((date.getTime() - new Date(date.getUTCFullYear(), 0, 1, -6))/86400000); 
     return 1 + Math.floor(dayNumber/7); 

    } 
} 

然后使用它或formatdateFormat()

xAxis: { 
     tickInterval: 7 * 24 * 36e5, // one week 
     labels: { 
      format: '{value:Week %W/%Y}' 
     } 
    }, 
+0

谢谢帕维尔,作品完美! – breq

+0

谢谢,它像一个魅力。 :) – anurag619

1

对于@帕维尔毕淑敏的回答,我发现当日期是2012/1/1女巫是星期天时,结果是错误的,所以我改变了答案:

W: function (timestamp) { 
    var date = new Date(timestamp); 
    var firstDay = new Date(date.getFullYear(), 0, 1); 
    var day = firstDay.getDay() == 0 ? 7 : firstDay.getDay(); 
    var days = Math.floor((date.getTime() - firstDay)/86400000) + day; // day numbers from the first Monday of the year to current date 
    return Math.ceil(days/7); 
}, 
0

为了保持数周和数年的一致性,我倾向于在处理星期编号时使用ISO-8601标准。

随着Pawel的回答和this blog的js代码,我建立了以下解决方案。

Highcharts.dateFormats = { 
     V: function (timestamp) {  
      var target = new Date(timestamp); 
      var dayNr = (target.getDay() + 6) % 7; 
      target.setDate(target.getDate() - dayNr + 3); 
      var firstThursday = target.valueOf(); 
      target.setMonth(0, 1); 
      if (target.getDay() != 4) { 
       target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7); 
      } 
      return 1 + Math.ceil((firstThursday - target)/604800000); // 604800000 = 7 * 24 * 3600 * 1000 
     } , 
     G: function(timestamp) { 
      var target = new Date(timestamp); 
      target.setDate(target.getDate() - ((target.getDay() + 6) % 7) + 3); 
      return target.getFullYear(); 
     } 
}; 

%V和%G尊重strftime format用于高炉。

+0

我得到了第53周的时间戳,这是在2016年1月4日与此代码...但natee的代码在这里下面给出第1周。 – envision

+0

欧洲和我们weeknumbers不同。 ISO8601需要在新的一年中有大部分时间才能获得第1周。因此2016年1月4日是2015年第53周。 – woens