WinForm(C#)倒计时(年月日时分秒)

简介:

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

 

 效果图:

 



本文转自Artwl博客园博客,原文链接:http://www.cnblogs.com/artwl/,如需转载请自行联系原作者

相关文章
C#编程-13:ProgressBar制作时间进度倒计时
C#编程-13:ProgressBar制作时间进度倒计时
186 0
C#编程-13:ProgressBar制作时间进度倒计时
|
1月前
|
C#
24. C# 编程:用户设定敌人初始血值的实现
24. C# 编程:用户设定敌人初始血值的实现
18 0
|
2月前
|
SQL 数据库连接 应用服务中间件
C#WinForm基础编程(三)
C#WinForm基础编程
71 0
|
2月前
C#WinForm基础编程(二)
C#WinForm基础编程
55 0
|
2月前
|
C# 数据安全/隐私保护
C#WinForm基础编程(一)
C#WinForm基础编程
59 0
|
4月前
|
数据采集 前端开发 C#
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
Twitter是全球最大的社交媒体平台之一,包含丰富的音频资源。用户可以在Twitter上发布、转发、评论和收听各种音频内容,如音乐、播客、新闻、故事等,直接从Twitter抓取音频数据并非易事,尤其是在考虑到可能的封锁和反爬虫机制。Twitter会对频繁访问的IP地址进行限制或封禁,以防止恶意爬虫的行为。因此,我们需要使用一些技术手段来规避这些障碍,确保稳定而高效的数据访问。
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
|
3月前
|
程序员 C#
深入理解 C# 编程:枚举、文件处理、异常处理和数字相加
枚举是一个特殊的“类”,表示一组常量(不可更改/只读变量)。 要创建枚举,请使用 enum 关键字(而不是 class 或 interface),并用逗号分隔枚举项:
37 0
|
3月前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
71 2
|
4月前
|
C# C++
C# 高效率编程 “多线程” 的基本使用
C# 高效率编程 “多线程” 的基本使用
|
6月前
|
开发框架 .NET 数据库
asp.net企业费用报销管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
asp.net 企业费用报销管理信息系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使 用c#语言开发 应用技术:asp.net c#+sqlserver 开发工具:vs2010 +sqlserver
49 0