一个朋友提到这个问题,就随手写了一个,本以为很容易,却写了差不多半个小时,关键是年月的判断,现把代码贴出来供需要的朋友参考,也希望能看到大家的计算方法,先在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;
}
}
效果图: