我试图在arearange
中绘制HighChart
类型。这是link。当我查看数据时,它具有以下格式[1230771600000, -5.8, 0.1]
。第一个表示日期时间,第二个表示最小值,第三个表示最大值。
所以,我的问题是,他们如何得到这个数字代表一天?在该元组中,1230771600000表示2009年1月1日。如果我在服务器端使用C#,如何将DateTime
对象转换为该数字?简而言之,如何将Jan 1st 2009
转为1230771600000
?谢谢你的帮助。
答案 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;
}