使用DatePicker和TimePicker时AddMinutes正常但AddHours失效问题排查
解决DatePicker+TimePicker整合DateTime时AddHours无效的问题
哥们,我之前也踩过这个坑!咱们来一步步揪出问题所在,大概率是两个常见原因之一:
1. 最容易忽略的:DateTime是不可变类型!
你是不是直接这么写的?
DateTime eventDate = new DateTime(dps.Year, dps.Month, dps.DayOfMonth); eventDate.AddHours(selectedHour); // 这里完全没用! eventDate.AddMinutes(selectedMinute);
DateTime的所有Add方法(AddHours、AddMinutes等)都不会修改原对象,而是返回一个新的DateTime实例。你必须把返回值重新赋值给变量,才会生效:
// 正确写法:赋值返回值 DateTime eventDate = new DateTime(dps.Year, dps.Month, dps.DayOfMonth); eventDate = eventDate.AddHours(selectedHour); eventDate = eventDate.AddMinutes(selectedMinute); // 或者更简洁的链式调用 DateTime eventDate = new DateTime(dps.Year, dps.Month, dps.DayOfMonth) .AddHours(selectedHour) .AddMinutes(selectedMinute);
这个是最常见的错误,很多人第一次用DateTime都会忘它的不可变性。
2. TimePicker的小时取值可能是12小时制,导致数值错误
如果你的TimePicker是12小时模式(带AM/PM选择),直接取Hour值可能会得到1-12的数字,而不是24小时制的0-23。比如选了下午2点,直接取到的是2而不是14,这时候AddHours(2)就会把时间加到凌晨2点,看起来像是没生效。
解决办法是先把小时转换为24小时制:
TimePicker tp = FindViewById<TimePicker>(Resource.Id.your_timepicker_id); int selectedHour = tp.Hour; int selectedMinute = tp.Minute; // 处理12小时制的转换 if (!tp.Is24HourView) { if (tp.CurrentHour == 12) selectedHour = 0; // 上午12点(午夜)转成0 else if (tp.CurrentHour > 12) selectedHour = tp.CurrentHour - 12; // 下午1点转成13,以此类推 }
完整示例代码
把这两点结合起来,完整的整合代码应该是这样的:
// 获取DatePicker日期 DatePicker dps = FindViewById<DatePicker>(Resource.Id.Start_dp); int year = dps.Year; int month = dps.Month; int day = dps.DayOfMonth; // 获取TimePicker时间并处理 TimePicker tp = FindViewById<TimePicker>(Resource.Id.your_timepicker_id); int selectedHour = tp.Hour; int selectedMinute = tp.Minute; // 12小时制转24小时制 if (!tp.Is24HourView) { selectedHour = tp.CurrentHour switch { 12 => 0, >12 => tp.CurrentHour - 12, _ => tp.CurrentHour }; } // 正确整合DateTime DateTime eventDateTime = new DateTime(year, month, day) .AddHours(selectedHour) .AddMinutes(selectedMinute);
先检查是不是忘记赋值AddHours的返回值,这个90%概率是问题所在;如果不是,再看TimePicker的小时取值是否正确。
内容的提问来源于stack exchange,提问作者user3794667384
相关产品推荐
相关产品推荐

