[英]How to convert string to datetime using Convert.ChangeType not considering timezone
此代碼將時區添加到DateTime,在實際場景中,此代碼位於通用函數內,以將字符串轉換為各種類型。 所以我需要一個通用代碼來適用於所有類型:
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 12:17:50}
有沒有辦法忽略時區?
我不能使用DateTime.Parse
和DateTime.ParseExact
。
我猜你收到你想要轉換成參數的類型,這就是為什么你不能使用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
使用泛型(您可以根據自己的需要進行調整):
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;
}
如果您知道時區與目標時區之間的時差,則可以使用DateTimeOffset來包含所述差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.