DateTime.Add年,月,AddDays,AddHour,AddMinute不添加?

时间:2013-02-03 22:21:59

标签: c# datetime

我有以下代码:

DateTime endTime = new DateTime(01, 01, 01, 00, 00, 00);

endTime = endTime.AddYears(currentYear - 1);
endTime = endTime.AddMonths(currentMonth - 1);
endTime = endTime.AddDays(currentDay - 1);

hourToWaitTo = Convert.ToInt32(txtboxHourToWaitTo.Text);
minuteToWaitTo = Convert.ToInt32(txtboxMinuteToWaitTo.Text);

endTime = endTime.AddHours(hourToWaitTo);
endTime = endTime.AddMinutes(minuteToWaitTo);

但它没有向endTime添加任何东西

EDIT1:

我将currentYear,currentMonth和currentDay设置为:

int currentYear = Convert.ToInt32(DateTime.Now.ToString("yyyy"));  
int currentMonth = Convert.ToInt32(DateTime.Now.ToString("MM")); 
int currentDay = Convert.ToInt32(DateTime.Now.ToString("dd"));

hourToWaitTo和minuteToWaitTo由用户在文本框中设置。

我希望用户设置一个时间(例如12:25)让计算机关机,我还想要一个倒计时来说明多少小时:分钟:几秒钟直到关机。我已设法完成所有这些,但我无法解决上面提到的endTime问题。

SOLUTION:

这个问题的解决方案非常简单:

DateTime endTime = new DateTime(currentYear, currentMonth, currentDay, hourToWaitTo, minuteToWaitTo, 0);

我之前尝试过这样做,但出于某种原因我收到了错误。要设置我使用的上述变量:

int currentYear = Convert.ToInt32(DateTime.Now.ToString("yyyy"));  
int currentMonth = Convert.ToInt32(DateTime.Now.ToString("MM")); 
int currentDay = Convert.ToInt32(DateTime.Now.ToString("dd"));

int minuteToWaitTo = Convert.ToInt32(txtboxMinuteToWaitTo.Text);
int hourToWaitTo = Convert.ToInt32(txtboxHourToWaitTo.Text);

谢谢大家的帮助。

3 个答案:

答案 0 :(得分:1)

这不是你问题的直接答案 - 你发布的代码看起来还不错,所以肯定会有其他事情发生 - 但我想知道你为什么不做这样的事情:

hourToWaitTo = Convert.ToInt32(txtboxHourToWaitTo.Text);
minuteToWaitTo = Convert.ToInt32(txtboxMinuteToWaitTo.Text);

DateTime endTime = new DateTime(currentYear, currentMonth, currentDay, hourToWaitTo, minuteToWaitTo, 0);

答案 1 :(得分:1)

这样的代码应该被废除:

int currentYear = Convert.ToInt32(DateTime.Now.ToString("yyyy"));  
int currentMonth = Convert.ToInt32(DateTime.Now.ToString("MM")); 
int currentDay = Convert.ToInt32(DateTime.Now.ToString("dd"));

您正在检查系统时钟三次,取出部分值,序列化为字符串,解析该字符串,然后使用每个部分。很多工作都没有。

你真正需要的是:

DateTime endTime = DateTime.Today.AddHours(hourToWaitTo)
                                 .AddMinutes(minuteToWaitTo);

您应该考虑与您合作的日期类型。当您使用构造函数构造DateTime时,除了明确告诉它需要什么样的日期之外,您将获得.Kind Unspecified。在您的方案中使用本地日期更合适,您可以使用DateTime.TodayDateTime.Now来获取本地日期。

另请注意,由于您要求用户使用本地时间,但允许他们输入时间组件,因此该时间可能无效或不明确。这种情况发生在夏令时转换期间。您可以使用TimeZoneInfo.Local.IsInvalidTime()TimeZoneInfo.Local.IsAmbiguousTime()验证用户输入。如果时间不明确,您需要询问您的用户“在夏令时过渡之前或之后?”或类似的东西。

最后,如果用户与相关计算机不在同一时区,那么您还有很多工作要做。您应该考虑使用DateTimeOffset代替,并且需要捕获关闭的预期偏移或时区。另一种方法是将时间转换为关闭事件的UTC时间。 Review this article了解更多详情和最佳做法。

答案 2 :(得分:0)

 new DateTime(year,month,day,hour,minute,0)