2012-11-29 34 views
1

我在JSON中表示日期時遇到問題。我使用服務堆棧作爲Web服務來獲取數據。我的服務器端代碼如下:不正確的JSON日期

public object Execute(GetNoPatientList request) 
    { 
     NoPatientList _noPatientList = new NoPatientList(); 

     List<string> _noMatchPatientList = new List<string>(); 
     List<NoPatientList> _newList = new List<NoPatientList>(); 
     try 
     { 
      using (SqlConnection cn = new SqlConnection(Database.WaldenWebConnection)) 
      { 
       cn.Open(); 
       using (SqlCommand cm = cn.CreateCommand()) 
       { 
        cm.CommandText = "select [DateTimeStamp] as DateCreated,[ID],[PatientMRN],[FirstName],[MiddleName]" 
         + " ,[LastName],convert(varchar,[DOB],101) as DOB,[Sex],[Note],[Source] as Interface" 
         + " from PatientNoMatch" 
         + " where FoundMatch = 'F'" 
         + " and Show = 'T'" 
         + " order by DateTimeStamp desc"; 

        SqlDataReader dr = cm.ExecuteReader(); 
        while (dr.Read()) 
        { 
         NoPatientList _noPatientList1 = new NoPatientList(); 

         _noPatientList1.PatientMRN = dr["PatientMRN"].ToString(); 
         _noPatientList1.FirstName = dr["FirstName"].ToString(); 
         _noPatientList1.MiddleName = dr["MiddleName"].ToString(); 
         _noPatientList1.LastName = dr["LastName"].ToString(); 
         _noPatientList1.DOB = dr["DOB"].ToString(); 
         _noPatientList1.Sex = dr["Sex"].ToString(); 
         _noPatientList1.Note = dr["Note"].ToString(); 
         _noPatientList1.DateCreated = dr.GetDateTime(0); 
         _noPatientList1.Interface = dr["Interface"].ToString(); 

         _newList.Add(_noPatientList1); 
        } 
        return _newList; 
       } 
      } 
     } 
     catch 
     { 
      return _newList; 
     } 
    } 

如下的類型被表示:

[DataContract] 
public class NoPatientList 
{ 
    [DataMember] 
    public string ID { get; set; } 

    [DataMember] 
    public string PatientMRN { get; set; } 

    [DataMember] 
    public string FirstName { get; set; } 

    [DataMember] 
    public string MiddleName { get; set; } 

    [DataMember] 
    public string LastName { get; set; } 

    [DataMember] 
    public string Sex { get; set; } 

    [DataMember] 
    public string DOB { get; set; } 

    [DataMember] 
    public string Note { get; set; } 

    [DataMember] 
    public DateTime DateCreated { get; set; } 

    [DataMember] 
    public string Interface { get; set; } 

} 

web服務是由從下面的調用Silverlight應用程序消耗:

/InterfaceUtility/servicestack/json/syncreply/

Silverlight應用程序正在使用以下代碼將代碼處理成網格

private void GetNoPatientMatchData() 
    { 
     try 
     { 
      gridViewNoMatch.ItemsSource = null; 
     } 
     catch { } 
     _client = new WebClient(); 
     _client.OpenReadCompleted += (a, f) => 
     { 
      if (!f.Cancelled && f.Error == null) 
      { 
       _listOfNoPatientsMatches = new List<NoPatientList>();      
       MemoryStream _memoryStream = new MemoryStream(); 
       f.Result.CopyTo(_memoryStream); 
       _memoryStream.Position = 0; 

       StreamReader _streamReader = new StreamReader(_memoryStream); 

       string _memoryStreamToText = _streamReader.ReadToEnd(); 

       List<NoPatientList> _deserializedNoPatientList = (List<NoPatientList>)Newtonsoft.Json.JsonConvert.DeserializeObject(_memoryStreamToText, typeof(List<NoPatientList>));     
       gridViewNoMatch.ItemsSource = _deserializedNoPatientList; 
      } 
      else 
      { 
       MessageBox.Show(f.Error.Message, 
        "Error", MessageBoxButton.OK); 
      } 
     }; 

     _client.OpenReadAsync(new Uri(_serviceUri + "getnopatientlist")); 

問題是,日期時間字段上的時間似乎總是關閉6個小時。

關於發生了什麼的任何想法?

+0

如果它是一個確切的小時(或很少半小時)倍數,那麼它可能是一個時區問題。 –

+0

如果服務器獲取和Silverlight應用程序所在的計算機位於同一時區,這是否是時區問題? – user1181226

回答

1

這可能是一個時區問題。檢查:

  • 您的web服務正在以UTC格式返回您的日期/時間。
  • 您的代碼將這些日期/時間解析爲UTC日期和時間。
+0

如果服務器獲取和Silverlight應用程序所在的計算機處於同一時區,這是否是時區問題? – user1181226

+0

這很可能是因爲Web服務通常默認設置爲以UTC格式返回日期和時間。這很簡單,因爲你不知道你的服務消費者將會在哪裏。 –