如何使用Convert.ChangeType将字符串转换为日期时间而不考虑时区

时间:2015-05-27 09:05:20

标签: c#

此代码将时区添加到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.ParseDateTime.ParseExact

3 个答案:

答案 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来包含上述差异。