我正在处理一个处理任何对象的方法,并更新所有对象的属性和子对象'属于该用户的当地时间的日期时间的属性。
以下是更新到当地时间的工作方法。
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);
}
}