HighChart xAxis日期时间值

时间:2014-03-26 15:13:14

标签: c# datetime highcharts

我试图在arearange中绘制HighChart类型。这是link。当我查看数据时,它具有以下格式[1230771600000, -5.8, 0.1]。第一个表示日期时间,第二个表示最小值,第三个表示最大值。

所以,我的问题是,他们如何得到这个数字代表一天?在该元组中,1230771600000表示2009年1月1日。如果我在服务器端使用C#,如何将DateTime对象转换为该数字?简而言之,如何将Jan 1st 2009转为1230771600000?谢谢你的帮助。

4 个答案:

答案 0 :(得分:2)

他们使用自Unix epoch以来的毫秒,即自1970-01-01 UTC以来,所以使用以下内容进行转换:

var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var data = myDates.Select(x => (x - epoch).TotalMilliseconds);

但是,他们的示例数据中的时间都是由于某种原因凌晨1点(可能是因为Highsoft's location),所以他们所有的1000 * 60 * 60都高于你得到的将上述内容应用于舍入的UTC日期。您应该使用UTC午夜值,但是您希望在转换时只是AddHours(1)或类似地匹配他们的数字。

答案 1 :(得分:1)

我更喜欢将JSON处理保持在最低限度。我建议将系列日期时间数据格式化为服务器上的纪元毫秒。当xAxis类型设置为datetime时,这似乎可以被highcharts接受。您可以使用此功能:

 private long EpochTime(DateTime dt)
        {
           //long form code to be clear
            TimeSpan t = dt - new DateTime(1970, 1, 1);
            long millisecondsSinceEpoch = (long)t.TotalSeconds * 1000;
            return millisecondsSinceEpoch  ;
        }

stovroz和wergeld上面的帖子中还有其他更现代的选项。 在将转换为客户端的JSON的对象中使用它。您需要返回一组日期/值点。我用这个课:

public class TimePointData
    {
        public long date { get; set; }
        public decimal value { get; set; }

    }

我在SqlDataReader循环中使用它:

while (reader2.Read())
{
    DateTime dTest = Convert.ToDateTime(reader2["XData"]);
    TimePointData newPoint = new TimePointData()
        {
        date = EpochTime(dTest) ,
        value = Convert.ToDecimal(reader2["YData"])
        };
    Series.data.Add(newPoint);
}

在javascript中设置选项:

 xAxis: {
          type: 'datetime',
          labels: {
                   formatter: function () {
                      return moment(this.value).format("YYYY-MM-DD"); //format as you need to
                   }
           },
           title: {
                text: 'Date'
           }
      },
      series: [{
              data: $scope.data.TimeSeriesData[0].data  //whatever is correct for your data structure
             }]

这在我的MVC项目中使用webapi数据调用和angularjs代码在可缩放区域图表中创建highcharts图形。当你这样做时,别忘了把舌头放在正确的位置:)

答案 2 :(得分:0)

您需要做一些pre =处理。我们在VB.NET中做的是遍历我们的数据数组以构建我们的highcharts series.data并执行以下操作:

    Private Function ToEpoch(value As Date) As Double
        Dim span As TimeSpan = (value.ToUniversalTime -
                                    New System.DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc))
        Return span.TotalMilliseconds
    End Function

因此,我们将解析为MM / DD / YYYY的SQL value发送到此函数中,并将其吐出javascript时间。

答案 3 :(得分:0)

如果您只考虑日期部分(不考虑时间)。这是我作为扩展方法的方法:

public static double ToEpochDateHighCharts(this DateTime date)
        {
            TimeSpan t = new DateTime(date.Year, date.Month, date.Day, 0, 0, 0, DateTimeKind.Utc) - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

            return t.TotalMilliseconds;
        }
相关问题