一个朋友提到这个问题,就随手写了一个,本以为很容易,却写了差不多半个小时,关键是年月的判断,现把代码贴出来供需要的朋友参考,也希望能看到大家的计算方法,先在WinForm窗体上放一个label控件(ID为lblShow) 和一个Timer控件(ID为timerMain),后台代码如下:
public
partial
class
FormTime : Form
{
public FormTime()
{
InitializeComponent();
}
private void FormTime_Load( object sender, EventArgs e)
{
timerMain.Enabled = true ;
timerMain.Interval = 1000 ;
timerMain.Start();
}
private void timerMain_Tick( object sender, EventArgs e)
{
DateTime observeTime = DateTime.Parse( " 2023-11-22 22:45:30 " ); // 倒计时日期
DateTime now = DateTime.Now; // 当前时间
TimeSpan ts = observeTime.Subtract(now); // 两个时间之差
StringBuilder result = new StringBuilder(); // 存放结果
int year = observeTime.Year - now.Year; // 得到相差的年
int month = observeTime.Month - now.Month; // 得到相差的月
int day = observeTime.Day - now.Day; // 得到相差的日
int hmh = (observeTime.Hour - now.Hour) * 3600 + (observeTime.Minute - now.Minute) * 60 + (observeTime.Second - now.Second);
// 如果时分秒比现在的时间晚
if (hmh <= 0 )
{
// 向日借一
day -- ;
if ((day <= 0 && month > 0 ) || (day <= 0 && year > 0 ))
{
// 如果天数小于0向月借一
day = GetDay(now.Year, now.Month) - now.Day + observeTime.Day;
month -- ;
if (month < 0 && year > 0 )
{
// 如果月数小于0,向年借一,同时把月专为正数
month += 12 ;
year -- ;
}
}
}
// 如果天数小于0向月借一
if ((day < 0 && month > 0 ) || (day < 0 && year > 0 ))
{
day = GetDay(now.Year, now.Month) - now.Day + observeTime.Day;
month -- ;
if (month < 0 && year > 0 )
{
// 如果月数小于0,向年借一,同时把月专为正数
month += 12 ;
year -- ;
}
}
// 如果月数小于0,向年借一,同时把月专为正数
if (month < 0 && year > 0 )
{
month += 12 ;
year -- ;
}
if (year < 0 || (year == 0 && month < 0 ) || (year == 0 && month == 0 && day < 0 ))
{
lblShow.Text = " 已超过日期 " ;
return ;
}
if (year > 0 )
{
result.Append(year + " 年 " );
}
if (month > 0 )
{
result.Append(month + " 月 " );
}
if (day > 0 )
{
result.Append(day + " 天 " );
}
if (ts.Hours > 0 )
{
result.Append(ts.Hours + " 时 " );
}
if (ts.Minutes > 0 )
{
result.Append(ts.Minutes + " 分 " );
}
if (ts.Seconds > 0 )
{
result.Append(ts.Seconds + " 秒 " );
}
if (result.Length == 0 )
{
result.Append( " 已超过日期 " );
}
lblShow.Text = result.ToString();
}
// 输入月份后获得该月天数
private int GetDay( int year, int month)
{
int result = 31 ;
switch (month)
{
case 4 :
case 6 :
case 9 :
case 11 :
result = 30 ;
break ;
case 2 :
if ((year % 100 != 0 ) && (year % 4 == 0 ) || (year % 400 == 0 ))
{
result = 29 ;
}
else
{
result = 28 ;
}
break ;
}
return result;
}
}
{
public FormTime()
{
InitializeComponent();
}
private void FormTime_Load( object sender, EventArgs e)
{
timerMain.Enabled = true ;
timerMain.Interval = 1000 ;
timerMain.Start();
}
private void timerMain_Tick( object sender, EventArgs e)
{
DateTime observeTime = DateTime.Parse( " 2023-11-22 22:45:30 " ); // 倒计时日期
DateTime now = DateTime.Now; // 当前时间
TimeSpan ts = observeTime.Subtract(now); // 两个时间之差
StringBuilder result = new StringBuilder(); // 存放结果
int year = observeTime.Year - now.Year; // 得到相差的年
int month = observeTime.Month - now.Month; // 得到相差的月
int day = observeTime.Day - now.Day; // 得到相差的日
int hmh = (observeTime.Hour - now.Hour) * 3600 + (observeTime.Minute - now.Minute) * 60 + (observeTime.Second - now.Second);
// 如果时分秒比现在的时间晚
if (hmh <= 0 )
{
// 向日借一
day -- ;
if ((day <= 0 && month > 0 ) || (day <= 0 && year > 0 ))
{
// 如果天数小于0向月借一
day = GetDay(now.Year, now.Month) - now.Day + observeTime.Day;
month -- ;
if (month < 0 && year > 0 )
{
// 如果月数小于0,向年借一,同时把月专为正数
month += 12 ;
year -- ;
}
}
}
// 如果天数小于0向月借一
if ((day < 0 && month > 0 ) || (day < 0 && year > 0 ))
{
day = GetDay(now.Year, now.Month) - now.Day + observeTime.Day;
month -- ;
if (month < 0 && year > 0 )
{
// 如果月数小于0,向年借一,同时把月专为正数
month += 12 ;
year -- ;
}
}
// 如果月数小于0,向年借一,同时把月专为正数
if (month < 0 && year > 0 )
{
month += 12 ;
year -- ;
}
if (year < 0 || (year == 0 && month < 0 ) || (year == 0 && month == 0 && day < 0 ))
{
lblShow.Text = " 已超过日期 " ;
return ;
}
if (year > 0 )
{
result.Append(year + " 年 " );
}
if (month > 0 )
{
result.Append(month + " 月 " );
}
if (day > 0 )
{
result.Append(day + " 天 " );
}
if (ts.Hours > 0 )
{
result.Append(ts.Hours + " 时 " );
}
if (ts.Minutes > 0 )
{
result.Append(ts.Minutes + " 分 " );
}
if (ts.Seconds > 0 )
{
result.Append(ts.Seconds + " 秒 " );
}
if (result.Length == 0 )
{
result.Append( " 已超过日期 " );
}
lblShow.Text = result.ToString();
}
// 输入月份后获得该月天数
private int GetDay( int year, int month)
{
int result = 31 ;
switch (month)
{
case 4 :
case 6 :
case 9 :
case 11 :
result = 30 ;
break ;
case 2 :
if ((year % 100 != 0 ) && (year % 4 == 0 ) || (year % 400 == 0 ))
{
result = 29 ;
}
else
{
result = 28 ;
}
break ;
}
return result;
}
}
效果图: