C# 控制台倒計時

来源:http://www.cnblogs.com/Aaxuan/archive/2017/02/25/6409843.html
-Advertisement-
Play Games

年前經常聊天的大佬群里有人寫了窗體的倒計時來計算下班時間和放假時間:) 簡直就是在嘲諷我這種沒有工作的人,哈哈哈 窗體的倒計時相當的沒有技術含量,主要是不夠炫酷,不能夠體現我們程式員的身份。 那什麼才叫炫酷?必須是控制台啊! 電視劇上黑客噼里啪啦噼里啪啦滾屏的畫面多炫酷! 所以,研究了一下怎麼樣在控 ...


年前經常聊天的大佬群里有人寫了窗體的倒計時來計算下班時間和放假時間:)

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

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

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

電視劇上黑客噼里啪啦噼里啪啦滾屏的畫面多炫酷!

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

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

 

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

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

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

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

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

 

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

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading;
 6 
 7 namespace Timer
 8 {
 9     class Program
10     {
11         static bool isEnd = false;
12 
13         static void Main(string[] args)
14         {
15             //控制台標題
16             Console.Title = "Timer";
17             //控制台寬度
18             Console.WindowWidth = 50;
19             //控制台高度25是最低
20             Console.BufferHeight = 25;
21             Console.WriteLine("現在的時間是");
22             Console.WriteLine(DateTime.Now);
23             Console.WriteLine("輸入截至時間");
24 
25             //獲取設定時間
26             DateTime dt = Convert.ToDateTime(Console.ReadLine());
27             //獲取開始時間
28             DateTime dtNow = Convert.ToDateTime(DateTime.Now);
29 
30 
31             //調用線程獲取時間
32             while (isEnd == false)
33             {
34                 Thread thread = new Thread(delegate() { GetTime(dt); });
35                 thread.Start();
36                 Thread.Sleep(1000);
37             }
38             Console.ReadLine();
39         }
40 
41 
42 
43         //輸出計時剩餘時間
44         static void GetTime(DateTime dt)
45         {
46             //獲取開始時間
47             DateTime dtNow = Convert.ToDateTime(DateTime.Now);
48             TimeSpan ts = dt - dtNow;
49             Console.ForegroundColor = ConsoleColor.Green;
50             Console.SetCursorPosition(8, 5);
51             Console.WriteLine(ts);
52             if (ts.TotalSeconds <= 1)
53             {
54                 Console.SetCursorPosition(0, 9);
55                 Console.WriteLine("計時已完成");
56                 isEnd = true;
57             }
58         }
59     }
60 }

 

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

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

 

這程式還是到處是BUG的,畢竟一天到晚寫的是BUG,不是程式。

我的程式,使用的是.NET Framework 4.0,各位電腦上應該都有。

(密碼:C2fyaK)

https://share.weiyun.com/076fa80d5a5b270c3f73b90e3fd77d48

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

獲得當前系統時間: DateTime dt = DateTime.Now;

Environment.TickCount可以得到“系統啟動到現在”的毫秒值

DateTime now = DateTime.Now;

Console.WriteLine(now.ToString("yyyy-MM-dd"));     //按yyyy-MM-dd格式輸出s

Console.WriteLine(dt.ToString());     // 26/11/2009 AM 11:21:30

Console.WriteLine(dt.Year.ToString());         // 2009
Console.WriteLine(dt.Date.ToString());         // 26/11/2009 AM 12:00:00
Console.WriteLine(dt.DayOfWeek.ToString());     // Thursday
Console.WriteLine(dt.DayOfYear.ToString());     // 330
Console.WriteLine(dt.Hour.ToString());         // 11
Console.WriteLine(dt.Millisecond.ToString());     // 801 (毫秒)
Console.WriteLine(dt.Minute.ToString());     // 21
Console.WriteLine(dt.Month.ToString());     // 11
Console.WriteLine(dt.Second.ToString());     // 30

Console.WriteLine(dt.TimeOfDay.ToString()); // 12:29:51.5181524

Console.WriteLine(dt.ToString()); // 26/11/2009 PM 12:29:51

Console.WriteLine(dt.AddYears(1).ToString()); // 26/11/2010 PM 12:29:51

Console.WriteLine(dt.CompareTo(dt).ToString()); // 0

Console.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:06
Console.WriteLine(dt.GetDateTimeFormats('t')[0].ToString()); //PM 1:29
Console.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 十一月, 2009
Console.WriteLine(dt.GetDateTimeFormats('D')[2].ToString()); //26 十一月, 2009
Console.WriteLine(dt.GetDateTimeFormats('D')[3].ToString()); //星期四 2009 11 26
Console.WriteLine(dt.GetDateTimeFormats('M')[0].ToString()); //26 十一月
Console.WriteLine(dt.GetDateTimeFormats('f')[0].ToString()); //2009年11月26日 PM 1:29
Console.WriteLine(dt.GetDateTimeFormats('g')[0].ToString()); //26/11/2009 PM 1:29
Console.WriteLine(dt.GetDateTimeFormats('r')[0].ToString()); //Thu, 26 Nov 2009 13:29:06 GMT

(註:
常用的日期時間格式:

格式 說明 輸出格式
d 精簡日期格式 MM/dd/yyyy
D 詳細日期格式 dddd, MMMM dd, yyyy
f 完整格式 (long date + short time) dddd, MMMM dd, yyyy HH:mm
F 完整日期時間格式 (long date + long time) dddd, MMMM dd, yyyy HH:mm:ss
g 一般格式 (short date + short time) MM/dd/yyyy HH:mm
G 一般格式 (short date + long time) MM/dd/yyyy HH:mm:ss
m,M 月日格式 MMMM dd
s 適中日期時間格式 yyyy-MM-dd HH:mm:ss
t 精簡時間格式 HH:mm
T 詳細時間格式 HH:mm:ss
)


Console.WriteLine(string.Format("{0:d}", dt)); //28/12/2009
Console.WriteLine(string.Format("{0:D}", dt)); //2009年12月28日
Console.WriteLine(string.Format("{0:f}", dt)); //2009年12月28日 AM 10:29
Console.WriteLine(string.Format("{0:F}", dt)); //2009年12月28日 AM 10:29:18
Console.WriteLine(string.Format("{0:g}", dt)); //28/12/2009 AM 10:29
Console.WriteLine(string.Format("{0:G}", dt)); //28/12/2009 AM 10:29:18
Console.WriteLine(string.Format("{0:M}", dt)); //28 十二月
Console.WriteLine(string.Format("{0:R}", dt)); //Mon, 28 Dec 2009 10:29:18 GMT
Console.WriteLine(string.Format("{0:s}", dt)); //2009-12-28T10:29:18
Console.WriteLine(string.Format("{0:t}", dt)); //AM 10:29
Console.WriteLine(string.Format("{0:T}", dt)); //AM 10:29:18
Console.WriteLine(string.Format("{0:u}", dt)); //2009-12-28 10:29:18Z
Console.WriteLine(string.Format("{0:U}", dt)); //2009年12月28日 AM 2:29:18
Console.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本身並不改變
View Code

 

 

轉載請聯繫


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 0x00 CREELINKS平臺簡介 0x00 CREELINKS平臺簡介 CREELINKS(創e聯)是由大信科技有限公司研發,集合軟硬體、操作系統、數據云儲存、開發工具於一體,用於物聯網產品的設計、研發與生產的平臺。 平臺涉及智能硬體、車聯網、智能家居、可穿戴設備、工業控制等各個物聯網領域。旨在 ...
  • 作為一個Linux新手,在寫這篇博客之前,裝了幾次jdk,好多次都是環境變數配置錯誤,導致無法登錄系統。經過幾天的研究,今天新裝系統,從頭來完整配置一遍 系統版本:Ubuntu 16.04 JDK版本:jdk1.8.0_121 1.官網下載JDK文件jdk-8u121-linux-x64.tar.g ...
  • Linux 用戶管理2 添加修改和刪除用戶,必須是超級管理員root賬號才可以進行的操作,所以噹噹前賬號不是超級管理員root賬號時,首先要先切換為root賬號。 如圖,ylq為普通用戶,執行添加用戶時,會出現如圖的錯誤: 快捷切換為root用戶: 添加用戶 useradd命令 此時便可以執行添加用 ...
  • 隨著網路的發展,網路安全也越來越重要,對於網站來說,從Http升級到https也是我們要做的首要事情。要實現https,首先我們需要申請一張SSL證書,這篇文章我主要介紹下邊這幾個方面: 1. SSL簡單介紹 2. 免費Letencrypt證書部署 3. 安裝註意事項 一.SSL簡單介紹 ssl作為 ...
  • 在linux進行連接windows下的ftp伺服器 ftp://192.168.2.71 輸入用戶名和密碼登陸成功 當使用get把文件下載後,然後unzip進行解壓時,出現了問題 error [10201_database_linux32.zip]: start of central directo ...
  • 第一步:搭建apache伺服器,這在上篇博客中已經完成 http://www.cnblogs.com/sangmu/p/6422238.html 第二步:安裝ssl yum install mod_ssl -y iptables -I INPUT 1 -p tcp --dport 443 -j AC ...
  • 昨天Boss在公司微信群發了此張圖片,"哪個水槽先灌滿",Insus.NET今天早上才有時間來研究一下: 如果你對此話題有興趣,你可以繼續討論和補充...... ...
  • 前述: 對資料庫操作的封裝,相信網路上已經有一大堆,ORM框架,或者是.NET本身的EF,都很好的支持資料庫操作。這篇文章是分享自己所思考的,對資料庫操作的簡單封裝。我對於這篇文章,認為被瀏覽者所關註重點的是怎麼分析設計資料庫操作封裝,代碼是其次。而且,這是我第一篇文章,為了想好怎麼實現花了些天,代 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...