将对象和子对象中的所有日期时间属性设置为本地时间

时间:2017-03-01 00:37:37

标签: c#

我正在处理一个处理任何对象的方法,并更新所有对象的属性和子对象'属于该用户的当地时间的日期时间的属性。

以下是更新到当地时间的工作方法。

    public static DateTime ToTimeZoneTime(DateTime time, string timeZoneId = "Pacific Standard Time")
    {
        TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
        return ToTimeZoneTime(time, tzi);
    }

    public static DateTime ToTimeZoneTime(DateTime time, TimeZoneInfo tzi)
    {
        return TimeZoneInfo.ConvertTimeFromUtc(time, tzi);
    }

以下是我目前正在处理任何对象的本地时间的方法。我在尝试更新子对象时遇到溢出错误。有没有更简单的方法来实现这一目标?

public static void ToLocalTime<T>(T obj, string timeZoneId)
{
        Type t = obj.GetType();

        // Loop through the properties.
        PropertyInfo[] props = t.GetProperties();
        for (int i = 0; i < props.Length; i++)
        {
            PropertyInfo p = props[i];
            // If a property is DateTime or DateTime?, set DateTimeKind to DateTimeKind.Utc.
            if (p.PropertyType == typeof(DateTime))
            {
                DateTime date = (DateTime)p.GetValue(obj, null);
                date = ToTimeZoneTime(date, timeZoneId);
                p.SetValue(obj, date, null);
            }
            // Same check for nullable DateTime.
            else if (p.PropertyType == typeof(Nullable<DateTime>))
            {
                DateTime? date = (DateTime?)p.GetValue(obj, null);
                if (date.HasValue)
                {
                    DateTime? newDate = ToTimeZoneTime(date.Value, timeZoneId);
                    p.SetValue(obj, newDate, null);
                }
            }

            if (p.PropertyType.IsClass && p.PropertyType != typeof(string) && typeof(IEnumerable).IsAssignableFrom(p.PropertyType))
            {
                ToLocalTime(p, timeZoneId);
            }
        }

0 个答案:

没有答案