说明:本文记录C#?和时间相关,延时、获取系统时间、时间格式转换、定时器 等,应用和代码。
System.Threading.Thread.Sleep(20); //毫秒
/* 主线程不卡延时函数 */
public static void Delay_ms(int milliSecond)
{
int start = Environment.TickCount;
while (Math.Abs(Environment.TickCount - start) < milliSecond)
{
Application.DoEvents();
}
}
/* 主线程不卡延时函数 */
public static bool Delay_s(int delayTime)
{
DateTime now = DateTime.Now;
int s;
do
{
TimeSpan spand = DateTime.Now - now;
s = spand.Seconds;
Application.DoEvents();
}
while (s < delayTime);
return true;
}
说明:Thread.Sleep(); 这函数延时并不准确,比如在10毫秒以内,这个函数本身的执行就要耗时10ms左右,所以在需要精确的 几十毫秒的延时可以用以下函数。
/* 阻塞式精确延时函数,单位ms */
public bool Dalay(int ms)
{
DateTime now = DateTime.Now;
int s;
do
{
TimeSpan spand = DateTime.Now - now;
s = spand.Minutes * 60 * 1000 + spand.Seconds * 1000 + spand.Milliseconds;
Application.DoEvents();
}
while (s < ms);
return true;
}
/*
功能:微秒延时(1000us == 1ms)
参数:延时时间单位ms
延时5us:delayUs(0.005);
*/
public static double DelayUs(double time)
{
System.Diagnostics.Stopwatch stopTime = new System.Diagnostics.Stopwatch();
stopTime.Start();
while (stopTime.Elapsed.TotalMilliseconds < time) { }
stopTime.Stop();
return stopTime.Elapsed.TotalMilliseconds;
}
????????这些是一些常见的延时代码实现方式,你可以根据具体需求选择适合的方法。请注意,使用延时时应避免在主线程中使用 Thread.Sleep() 方法,以免阻塞 UI 界面的响应。
在 C# 中,有多种实现延时的方式。下面列举了一些常用的延时代码示例:
1.使用 Thread.Sleep() 方法:
using System.Threading;
// 休眠 1 秒
Thread.Sleep(1000);
2.使用 Task.Delay() 方法:
using System.Threading.Tasks;
// 异步延时 1 秒
await Task.Delay(1000);
3.使用 Timer 类:
using System.Threading;
// 创建一个 Timer 对象,延时 1 秒后执行指定的方法
Timer timer = new Timer(MyMethod, null, 1000, Timeout.Infinite);
// 定义要执行的方法
private static void MyMethod(object state)
{
// 这里放需要执行的代码
}
4.使用 Stopwatch 类:
using System.Diagnostics;
// 创建 Stopwatch 对象并启动计时
Stopwatch stopwatch = Stopwatch.StartNew();
// 延时 1 秒
while (stopwatch.ElapsedMilliseconds < 1000)
{
// 等待
}
// 停止计时器
stopwatch.Stop();
long tick_time;
DateTime time = new DateTime(); /* 定义一个Datatime 变量并初始化 */
time = DateTime.Now; /* 获取当前时间,赋值给一个Datatime 变量 */
tick_time = DateTime.Now.Second; /* 获取当前时间的秒的数值 0-59 */
tick_time = DateTime.Now.Millisecond;/* 获取当前时间的毫秒 */
tick_time = DateTime.Now.Ticks; /* 获取tick ,得到的值是自公历 0001-01-01 00:00:00:000 至此的以 100 ns(即 1/10000 ms)为单位的时间数。 */
int hour = DateTime.Now.Hour; /* 获取当前时间的小时 */
int minute = DateTime.Now.Minute; /* 获取当前时间的分钟 */
//label158.Text = "更新时间:" + time.ToString(); /* 把时间变量转换为字符串格式赋值给一个标签用于显示转换后 2022/09/27 13:51:30 */
label158.Text = "更新时间:" + tick_time.ToString(); /* 把时间变量转换为字符串格式赋值给一个标签用于显示转换后 2022/09/27 13:51:30 */
????????双击窗口中添加号的定时器控件,可以进入对应的代码区域,添加具体的需要根据定时器运行的相关代码。
timer_rec.Enabled = m_bOpen==1?true:false;
/* 定时器根据 m_bOpen 的值来使能或者失能 */
timer_send.Stop(); /* 定时器停止 */
timer_send.Start(); /* 定时器启动 */
????????Stopwatch:提供一组方法和属性,可以准确的测量运行时间。使用的时候需要引用命名空间:System.Diagnostics。
//创建Stopwatch实例
Stopwatch sw = new Stopwatch();
//开始计时
sw.Start();
for (int i = 0; i < 100; i++)
{
Console.WriteLine(i);
}
//停止计时
sw.Stop();
Console.WriteLine("用时:" + sw.ElapsedMilliseconds + "");
//重置 停止时间间隔测量,并将运行时间重置为0
sw.Reset();
Console.WriteLine("用时:" + sw.ElapsedMilliseconds + "");
//重启 停止时间间隔测量,并将运行时间重置为0,然后重新开始测量运行时间
sw.Restart();
for (int i = 0; i < 100; i++)
{
Console.WriteLine(i);
}
sw.Stop();
//获取当前实例测量得出的总运行时间(以毫秒为单位)
Console.WriteLine("用时:" + sw.ElapsedMilliseconds + "");
//获取当前实例测量得出的总运行时间
Console.WriteLine("用时:"+sw.Elapsed);
//获取当前实例测量得出的总运行时间(用计时器刻度表示)。
Console.WriteLine(sw.ElapsedTicks);
Console.Read();
//使用StartNew,相当于已经实例化并且启动计时
Stopwatch sw=Stopwatch.StartNew();
for (int i = 0; i < 100; i++)
{
Console.WriteLine(i);
}
sw.Stop();
//获取当前实例测量得出的总运行时间(以毫秒为单位)
Console.WriteLine("用时:" + sw.ElapsedMilliseconds + "");
//获取当前实例测量得出的总运行时间
Console.WriteLine("用时:"+sw.Elapsed);
Console.Read();
/* 输入参数 秒 返回时分秒的字符串*/
private string Seconds_To_HMS(long totalTime)
{
string date = string.Empty;
var seconds = (int)(totalTime % 60);
var minutes = (int)(totalTime / 60) % 60;
//var hours = (int)(totalTime / 3600) % 60; /* 最多显示60小时 */
var hours = (int)(totalTime / 3600);
date = string.Format("{0:00}{1:00}{2:00}", hours + ":", minutes + ":", seconds + "s");
return date;
}
举例:比如给定一个日期时间为:2022-03-30 08:00:00
现在要改成:2022-03-30 12:30:28
代码如下:
DateTime time = new DateTime(2022, 3, 30, 8, 0, 0); //2022/3/30 8:00:00
DateTime tt=time.Date.Add(new TimeSpan(12, 30, 28)); //2022/3/30 12:30:28
DateTime n = time.Date + new TimeSpan(12, 30, 28); //2022/3/30 12:30:28
如果需求是在这个时间基础上加 12小时30分28秒
如果需求是在这个时间基础上加 12小时30分28秒
DateTime newTime = time.Add(new TimeSpan(12, 30, 28)); // 2022/3/30 20:30:28
????????开始通过DateTime中的Compare进行比较,如下图所示,它接收两个日期参数