C#: 和时间相关,延时、获取系统时间、时间格式转换、定时器 等

说明:本文记录C# 和时间相关,延时、获取系统时间、时间格式转换、定时器 等,应用和代码。

1.延时函数

System.Threading.Thread.Sleep(20); //毫秒

1.1 主线程不卡延时函数

/* 主线程不卡延时函数 */

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;
}

1.2 阻塞式精确延时函数,单位ms

说明: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;
}

1.3 微秒延时

/*
功能:微秒延时(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;
}

1.4 其他延时代码

        这些是一些常见的延时代码实现方式,你可以根据具体需求选择适合的方法。请注意,使用延时时应避免在主线程中使用 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();

2. 获取系统时间

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 */

3. 定时器

3.1 定时器添加

        双击窗口中添加号的定时器控件,可以进入对应的代码区域,添加具体的需要根据定时器运行的相关代码。

3.2 定时器的使能和失能

timer_rec.Enabled = m_bOpen==1?true:false;
/* 定时器根据 m_bOpen 的值来使能或者失能 */
timer_send.Stop();    /* 定时器停止 */
timer_send.Start();   /* 定时器启动 */

4. Stopwatch 计算代码运行时间

1、什么是Stopwatch

        Stopwatch:提供一组方法和属性,可以准确的测量运行时间。使用的时候需要引用命名空间:System.Diagnostics。

2、Stopwatch的简单使用

//创建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();

5. 秒转换为 时分秒格式字符串


/* 输入参数 秒 返回时分秒的字符串*/
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;
}

6. C# 只改变一个给定日期时间 的时间部分

举例:比如给定一个日期时间为: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

7. C#比较日期的方法总结

参考:C#比较日期的方法总结_C#教程_脚本之家

        开始通过DateTime中的Compare进行比较,如下图所示,它接收两个日期参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值