簡體   English   中英

如何使用不考慮時區的Convert.ChangeType將字符串轉換為日期時間

[英]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.ParseDateTime.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM