詳解C# 控制台倒計時

來源:互聯網
上載者:User
年前經常聊天的大佬群裡有人寫了表單的倒計時來計算下班時間和放假時間:)

簡直就是在嘲諷我這種沒有工作的人,哈哈哈

表單的倒計時相當的沒有技術含量,主要是不夠炫酷,不能夠體現我們程式員的身份。

那什麼才叫炫酷?必須是控制台啊!

電視劇上駭客劈裡啪啦劈裡啪啦滾屏的畫面多炫酷!

所以,研究了一下怎麼樣在控制台上計時。

百度到了msdn的老文章,所有的回答都是使用線程。那就用線程吧。

主要的計時方法就是使用 Thread.Sleep(1000); 方法,使主線程停止一秒。

然後迴圈使用線程調用傳參方法 Thread thread = new Thread(delegate() { GetTime(dt); });

這個方法計算時間差然後輸出時間。

這樣就會完成一個bug(比心,用心創造BUG),雖然計算一下時間,再輸出,基本上是用不了多少時間的,

但是幾百次幾千次以後就會導致兩次輸出時間裡少了一秒,但對於最後的結果來說並無大礙。

(後知後覺,不用線程調用方法應該也可以,主要還是Thread.Sleep(1000);)

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace Timer{    class Program    {        static bool isEnd = false;        static void Main(string[] args)        {            //控制台標題            Console.Title = "Timer";            //控制台寬度            Console.WindowWidth = 50;            //控制台高度25是最低            Console.BufferHeight = 25;            Console.WriteLine("現在的時間是");            Console.WriteLine(DateTime.Now);            Console.WriteLine("輸入截至時間");            //擷取設定時間            DateTime dt = Convert.ToDateTime(Console.ReadLine());            //擷取開始時間            DateTime dtNow = Convert.ToDateTime(DateTime.Now);            //調用線程擷取時間            while (isEnd == false)            {                Thread thread = new Thread(delegate() { GetTime(dt); });                thread.Start();                Thread.Sleep(1000);            }            Console.ReadLine();        }        //輸出計時剩餘時間        static void GetTime(DateTime dt)        {            //擷取開始時間            DateTime dtNow = Convert.ToDateTime(DateTime.Now);            TimeSpan ts = dt - dtNow;            Console.ForegroundColor = ConsoleColor.Green;            Console.SetCursorPosition(8, 5);            Console.WriteLine(ts);            if (ts.TotalSeconds <= 1)            {                Console.SetCursorPosition(0, 9);                Console.WriteLine("計時已完成");                isEnd = true;            }        }    }}

Console.ForegroundColor = ConsoleColor.Green; 改變輸出字元的顏色為綠色。

Console.SetCursorPosition(8, 5); 是改變游標的位置的語句,代表游標第5行第8個字元,這時候再進行輸出就是在這裡輸出了。

輸出的結果依然是原始詳細的時間格式,不過稍作修改就會更美觀一點,下面是一些有關時間的輸出語句。

獲得當前系統時間: DateTime dt = DateTime.Now;Environment.TickCount可以得到“系統啟動到現在”的毫秒值DateTime now = DateTime.Now;Console.WriteLine(now.ToString("yyyy-MM-dd"));     //按yyyy-MM-dd格式輸出sConsole.WriteLine(dt.ToString());     // 26/11/2009 AM 11:21:30Console.WriteLine(dt.Year.ToString());         // 2009Console.WriteLine(dt.Date.ToString());         // 26/11/2009 AM 12:00:00Console.WriteLine(dt.DayOfWeek.ToString());     // ThursdayConsole.WriteLine(dt.DayOfYear.ToString());     // 330Console.WriteLine(dt.Hour.ToString());         // 11Console.WriteLine(dt.Millisecond.ToString());     // 801 (毫秒)Console.WriteLine(dt.Minute.ToString());     // 21Console.WriteLine(dt.Month.ToString());     // 11Console.WriteLine(dt.Second.ToString());     // 30Console.WriteLine(dt.TimeOfDay.ToString()); // 12:29:51.5181524Console.WriteLine(dt.ToString()); // 26/11/2009 PM 12:29:51Console.WriteLine(dt.AddYears(1).ToString()); // 26/11/2010 PM 12:29:51Console.WriteLine(dt.CompareTo(dt).ToString()); // 0Console.WriteLine(dt.Add(new TimeSpan(1,0,0,0)).ToString()); // 加上一個時間段(註:System.TimeSpan為一個時間段,建構函式如下public TimeSpan(long ticks); // ticks: A time period expressed in 100-nanosecond units.//nanosecond:十億分之一秒 new TimeSpan(10,000,000) 為一秒public TimeSpan(int hours, int minutes, int seconds);public TimeSpan(int days, int hours, int minutes, int seconds);public TimeSpan(int days, int hours, int minutes, int seconds, int milliseconds);)Console.WriteLine("The Time is {0}",End-Start);Console.WriteLine(dt.GetDateTimeFormats('s')[0].ToString()); //2009-11-26T13:29:06Console.WriteLine(dt.GetDateTimeFormats('t')[0].ToString()); //PM 1:29Console.WriteLine(dt.GetDateTimeFormats('y')[0].ToString()); //2009年11月Console.WriteLine(dt.GetDateTimeFormats('D')[0].ToString()); //2009年11月26日Console.WriteLine(dt.GetDateTimeFormats('D')[1].ToString()); //星期四, 26 十一月, 2009Console.WriteLine(dt.GetDateTimeFormats('D')[2].ToString()); //26 十一月, 2009Console.WriteLine(dt.GetDateTimeFormats('D')[3].ToString()); //星期四 2009 11 26Console.WriteLine(dt.GetDateTimeFormats('M')[0].ToString()); //26 十一月Console.WriteLine(dt.GetDateTimeFormats('f')[0].ToString()); //2009年11月26日 PM 1:29Console.WriteLine(dt.GetDateTimeFormats('g')[0].ToString()); //26/11/2009 PM 1:29Console.WriteLine(dt.GetDateTimeFormats('r')[0].ToString()); //Thu, 26 Nov 2009 13:29:06 GMT(註:常用的日期時間格式:格式 說明 輸出格式d 精簡日期格式 MM/dd/yyyyD 詳細日期格式 dddd, MMMM dd, yyyyf 完整格式 (long date + short time) dddd, MMMM dd, yyyy HH:mmF 完整日期時間格式 (long date + long time) dddd, MMMM dd, yyyy HH:mm:ssg 一般格式 (short date + short time) MM/dd/yyyy HH:mmG 一般格式 (short date + long time) MM/dd/yyyy HH:mm:ssm,M 月日格式 MMMM dds 適中日期時間格式 yyyy-MM-dd HH:mm:sst 精簡時間格式 HH:mmT 詳細時間格式 HH:mm:ss)Console.WriteLine(string.Format("{0:d}", dt)); //28/12/2009Console.WriteLine(string.Format("{0:D}", dt)); //2009年12月28日Console.WriteLine(string.Format("{0:f}", dt)); //2009年12月28日 AM 10:29Console.WriteLine(string.Format("{0:F}", dt)); //2009年12月28日 AM 10:29:18Console.WriteLine(string.Format("{0:g}", dt)); //28/12/2009 AM 10:29Console.WriteLine(string.Format("{0:G}", dt)); //28/12/2009 AM 10:29:18Console.WriteLine(string.Format("{0:M}", dt)); //28 十二月Console.WriteLine(string.Format("{0:R}", dt)); //Mon, 28 Dec 2009 10:29:18 GMTConsole.WriteLine(string.Format("{0:s}", dt)); //2009-12-28T10:29:18Console.WriteLine(string.Format("{0:t}", dt)); //AM 10:29Console.WriteLine(string.Format("{0:T}", dt)); //AM 10:29:18Console.WriteLine(string.Format("{0:u}", dt)); //2009-12-28 10:29:18ZConsole.WriteLine(string.Format("{0:U}", dt)); //2009年12月28日 AM 2:29:18Console.WriteLine(string.Format("{0:Y}", dt)); //2009年12月Console.WriteLine(string.Format("{0:yyyyMMddHHmmssffff}", dt)); //200912281029182047計算2個日期之間的天數差DateTime dt1 = Convert.ToDateTime("2007-8-1");DateTime dt2 = Convert.ToDateTime("2007-8-15");TimeSpan span = dt2.Subtract(dt1);int dayDiff = span.Days ;計算某年某月的天數int days = DateTime.DaysInMonth(2009, 8);days = 31;給日期增加一天、減少一天DateTime dt =DateTime.Now;dt.AddDays(1); //增加一天 dt本身並不改變dt.AddDays(-1);//減少一天 dt本身並不改變
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.