2013-08-19 24 views
0

如何優化以下將DataSet DateTime列從US/UK格式轉換爲US格式的方法。最初的日期格式可以是美國/英國或任何其他國家。需要將其轉換爲美國日期格式輸出數據集中將DataSet中的DateTime列格式從US/UK轉換爲US

private DataSet ModifyDateToUSFormat(DataSet ds) 
    { 
     DataSet dsRes = new DataSet(); 
     DateTimeFormatInfo usDtfi = new CultureInfo("en-US", false).DateTimeFormat; 

     //Convert from DateTime to String Type 
     DataTable dtCloned = ds.Tables[0].Clone(); 
     foreach (DataColumn dc in ds.Tables[0].Columns) 
     { 
      if (dc.DataType == typeof(DateTime)) 
       dtCloned.Columns[dc.ColumnName].DataType = typeof(string); 
     } 

     foreach (DataRow row in ds.Tables[0].Rows) 
      dtCloned.ImportRow(row); 

     //Change the String format to US format. Since Database expects US Format Only. 
     foreach (DataRow row in dtCloned.Rows) 
     { 
      foreach (DataColumn dc in ds.Tables[0].Columns) 
      { 
       if (dc.DataType == typeof(DateTime)) 
        row[dc.ColumnName] = DateTime.Parse(row[dc.ColumnName].ToString(), CultureInfo.CurrentCulture, DateTimeStyles.NoCurrentDateDefault).ToString(usDtfi.ShortDatePattern); 
      } 
     } 

     dsRes.Tables.Add(dtCloned); 
     return dsRes; 
    } 

回答

0

您正在創建您正試圖解決的問題。

A DateTime不攜帶任何文化信息或特定格式。數據庫中的日期和時間數據類型都沒有,例如SQL Server中的datetime

當您將它從DateTime轉換爲string時 - 那是當您使用文化信息來應用格式時。然後你試圖使用不同的文化來解析不同格式的字符串,並將其解析爲DateTime,這裏又沒有文化信息。

那麼簡單的答案是 - 不要這樣做

要說得很清楚 - 當您在SQL Management Studio,Visual Studio Debugger或任何您正在使用的環境中看到數據庫輸出時 - 這不是DateTime。這就是DateTime的代表的string。無論你在哪裏尋找將適用當前的文化當你查看它。它實際上並不以該格式存在於數據庫中。

例如,在SQL Server中,datetime字段存儲爲8個字節。考慮:

-- implicitly convert to varchar using the current culture info 
select getdate() -- outputs: 2013-08-19 15:38:41.503 

-- explicity convert to varchar using the current culture info 
select convert(varchar, getdate()) -- outputs: Aug 19 2013 3:38PM 

-- explicity convert to varbinary to show how it's really stored 
select convert(varbinary, getdate()) -- outputs: 0x0000A21F0101D1C3 
+0

Thx Matt爲您提供幫助。改性上述功能如下 '私有數據集ModifyDateToUSFormat(數據集DS) { 的foreach(DataColumn的DC在ds.Tables [0] .Columns) { 如果(dc.DataType == typeof運算(日期時間)) 直流。 DateTimeMode = DataSetDateTime.Unspecified; } return ds; }' – Ram

+0

完全是一個完全不同的概念。你可能會發現這個設置已經*了* Unspecified' - 或者更可能是'UnspecifiedLocal' - 但這在這裏並不重要。您應該將精力集中在操縱數據集上,而不是集中在最終輸出數據集的位置上。 –

相關問題