Maison  >  Article  >  développement back-end  >  Explication détaillée du compte à rebours de la console C#

Explication détaillée du compte à rebours de la console C#

迷茫
迷茫original
2017-03-26 14:56:564203parcourir

Quelqu'un dans le groupe des grands patrons avec qui nous discutions souvent il y a des années a écrit un compte à rebours pour calculer le temps nécessaire pour quitter le travail et les vacances :)

C'est juste pour se moquer des gens comme moi qui n'ont pas de travail, hahaha

Le compte à rebours dans le formulaire n'est pas du tout technique, principalement parce qu'il n'est pas assez cool et ne peut pas refléter notre identité de programmeurs.

Alors, qu'est-ce qu'être cool ? Ce doit être une console !

Les scènes de hackers crépitant et défilant dans la série TV sont trop cool !

Alors, j'ai fait quelques recherches sur la façon de le chronométrer sur la console.

Baidu est venu à l'ancien message de msdn, et toutes les réponses ont utilisé des fils de discussion. Utilisez ensuite des fils.

La méthode de synchronisation principale consiste à utiliser la méthode Thread.Sleep(1000) pour arrêter le thread principal pendant une seconde.

Ensuite, bouclez le fil pour appeler la méthode de passage des paramètres Thread thread = new Thread(delegate() { GetTime(dt); });

Cette méthode calcule la différence de temps puis génère le temps.

De cette façon, un bug sera complété (soyez prudent et créez des bugs avec soin). Bien que vous calculiez le temps et le produisiez, cela ne prendra en principe pas beaucoup de temps

Mais. des centaines de fois et des milliers de fois. Après cela, cela entraînera une perte d'une seconde dans les deux temps de sortie, mais cela n'a pas d'importance pour le résultat final.

(Avec le recul, il devrait être possible d'appeler la méthode sans thread, l'essentiel est 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 ; Changer le caractère de sortie La couleur est verte.

Console.SetCursorPosition(8, 5); est une instruction qui modifie la position du curseur, représentant le 8ème caractère de la 5ème ligne du curseur. À ce moment, la sortie sera affichée ici.

Le résultat de sortie est toujours dans le format d'heure détaillé d'origine, mais il sera plus beau avec de légères modifications. Voici quelques déclarations de sortie sur l'heure.

获得当前系统时间: 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/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/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本身并不改变

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn