2014-03-26 104 views
2

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

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

回答

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点UTC出于某种原因(可能是因为Highsoft's location),所以它们都比将UTC应用于舍入UTC日期时高1000 * 60 * 60。你只需使用UTC午夜值就可以,但是如果你希望准确地匹配他们的数字,只需在您的转换中使用AddHours(1)或类似的数字。

+0

所以你的意思了'epoch'应该是'VAR划时代=新的日期时间(1970年,1,1,0,0,0,DateTimeKind.Utc).AddHours( 1)'? – AnhTriet

+0

不,如果您正在调整时期,则为“AddHours(-1)”;如果您调整减去时期的结果,则为“AddHours(1)”。但是,再次,只有在出于某种原因需要匹配示例中的确切数字时,您才需要使用自己的数据来获取工作图表。 – stovroz

+0

它的工作原理!我的时间是格林威治标准时间+7,所以我设置了“AddHours(-7)”。我必须仔细设置时间,以便xAxis可以正确显示以及“十字线”。非常感谢! – AnhTriet

0

您将需要执行一些预处理。

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派:我们在VB.NET没有通过我们的数据阵列来建立我们的highcharts series.data并执行以下操作是循环它吐出的JavaScript时间。

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代码在可缩放区域图表中创建高图形图形。当你这样做时,别忘了让你的舌头处于正确的位置:)

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; 
     }