此代码将时区添加到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
。
答案 0 :(得分: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
答案 1 :(得分: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;
}
答案 2 :(得分:0)
如果您知道时区与目标时区之间的时差,可以使用DateTimeOffset来包含上述差异。