2015-05-27 44 views
2

該代碼將時區添加到日期時間,在真實場景中,此代碼位於通用函數內部以將字符串轉換爲各種類型。所以我需要一個通用的代碼工作於所有類型:如何將字符串轉換爲日期時間使用Convert.ChangeType不考慮時區

DateTime d = DateTime.MinValue; 
string s = "2006-10-31T11:17:50Z"; 
d = (DateTime)Convert.ChangeType(s, typeof(DateTime),CultureInfo.InvariantCulture); 

在我的電腦用+1時區d是: {31/10/2006十二時17分五十秒}

是否有辦法忽略時區?

我不能使用DateTime.ParseDateTime.ParseExact

+0

爲什麼你不能使用DateTime.Parse? –

+0

如果我理解你的問題:你的意思是你想要變量「d」來保存任何數據類型。我對嗎? – Alex

+0

你不應該忽略TimeZone。 DateTime將被錯誤地存儲。日期時間以UTF時間存儲在計算機中。網絡庫使用計算機中的時區設置將本地時間轉換爲UTF。當數據在計算機的不同時區收集時,您必須使用時區正確存儲數據。 – jdweng

回答

1

我想你會收到你想要轉換爲參數的類型,這就是爲什麼你不能使用DateTime.Parse ... 但你至少可以測試類型嗎?這樣的事情是不是最漂亮的,但應該工作:

var s = "2006-10-31T11:17:50Z"; 
var t = typeof(DateTime); 
var d = Convert.ChangeType(s, t, CultureInfo.InvariantCulture); 

if (t == typeof(DateTime)) 
    d = TimeZoneInfo.ConvertTimeToUtc((DateTime)d); 

Console.WriteLine(d.ToString()); 

輸出

10/31/2006 11:17:50 AM 
+0

當然是很好的解決方案 – FDB

1

使用泛型(可以適應滿足您的需要):

public TDest ConvertValue<TSrc, TDest>(TSrc src, Func<TDest, TDest> adapter = null) 
{ 
    var converted = Convert.ChangeType(src, typeof(TDest), CultureInfo.InvariantCulture); 
    if (adapter == null) 
    { 
     adapter = GetDefaultAdapter<TDest>(); 
    } 
    return adapter(converted); 
} 

private static readonly Hashtable DefaultAdapters = InitializeAdapters(); 
private static Hashtable InitializeAdapters() 
{ 
    var hashtable = new Hashtable 
    { 
     {typeof (DateTime).Name, (Func<DateTime, DateTime>)(t => DateTime.SpecifyKind(t, t.ToUniversalTime())}, 
    }; 

    return hashtable; 
} 

public static Func<T, T> GetDefaultAdapter<T>() 
{ 
    Func<T, T> ret = f => f; 
    if (DefaultAdapters.ContainsKey(typeof(T).Name)) 
    { 
     ret = (Func<T, T>)DefaultAdapters[typeof(T).Name]; 
    } 

    return ret; 
} 
相關問題