8.C# —— 随机数、DateTime时间、字符串

一、C# 随机数(伪随机 + 安全随机)

1. 核心概念

计算机中没有真正的随机数,生成的都是伪随机数(通过算法 + 种子计算得出)。

  • 种子相同 → 生成的随机数序列完全相同
  • 不指定种子 → 默认使用系统当前时间作为种子,随机性更好

2. 常用随机数生成方式

(1)Random 类(基础随机数,推荐日常使用)
cs 复制代码
// 1. 指定种子(种子相同,随机数相同)
Random r1 = new Random(10);
Console.WriteLine(r1.Next()); 

// 2. 不指定种子(默认时间为种子,推荐)
Random r2 = new Random();

// 生成指定范围随机数 [min, max) 包含最小值,不包含最大值
Console.WriteLine(r2.Next(10, 21)); // 10~20
Console.WriteLine(r2.Next(21));    // 0~20

// 3. 循环生成多个随机数(重点:Random 不要写在循环内!)
Random r3 = new Random();
for (int i = 0; i < 4; i++)
{
    Console.WriteLine(r3.Next()); // 正确用法
}
(2)随机生成字母 / 字符串
cs 复制代码
// 方式1:从指定字符串中随机取字符
string str = "qwertyuiopasdfghjklzxcvbnm";
Random r4 = new Random();
// 生成4位随机字母
string res = "";
for (int i = 0; i < 4; i++)
{
    res += str[r4.Next(str.Length)];
}
Console.WriteLine(res);

// 方式2:通过 ASCII 码生成 a-z(97~122)
string res2 = "";
for (int i = 0; i < 4; i++)
{
    res2 += (char)r4.Next(97, 123);
}
Console.WriteLine(res2);
(3)高级随机数(了解)
  • GUID :全球唯一标识符,几乎不会重复,适合生成订单号、唯一 ID

    cs 复制代码
    Console.WriteLine(Guid.NewGuid()); 
  • RNGCryptoServiceProvider :加密级安全随机数,适合密码、密钥场景

    cs 复制代码
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] bs = new byte[10];
    rng.GetBytes(bs);
    Console.WriteLine(BitConverter.ToString(bs));

3. 避坑指南

  • 循环生成随机数时,不要在循环内 new Random (),会因为执行时间过短导致种子相同,随机数重复。

二、DateTime 日期时间操作

1. 核心作用

DateTime 是结构体,用于存储、获取、格式化系统日期和时间。

2. 获取当前时间 + 拆分年月日时分秒

cs 复制代码
// 获取当前系统时间
DateTime now = DateTime.Now;
Console.WriteLine(now);

// 拆分时间分量
Console.WriteLine(now.Year);         // 年
Console.WriteLine(now.Month);        // 月
Console.WriteLine(now.Day);          // 日
Console.WriteLine(now.Hour);         // 小时(24制)
Console.WriteLine(now.Minute);       // 分钟
Console.WriteLine(now.Second);       // 秒
Console.WriteLine(now.Millisecond);  // 毫秒
Console.WriteLine(now.DayOfWeek);    // 星期(英文)
Console.WriteLine((int)now.DayOfWeek); // 星期数字(周日=0)
Console.WriteLine(now.DayOfYear);    // 当年第几天

3. 时间格式化字符串(重点)

通过 ToString(格式符) 自定义时间显示格式:

格式符 含义 示例
yyyy 4 位年份 2026
MM 2 位月份 05
dd 2 位日期 21
HH 24 小时制 14
hh 12 小时制 02
mm 分钟 30
ss 59
fff 毫秒 123
cs 复制代码
DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss")); 
Console.WriteLine(now.ToString("今年是yyyy年MM月dd日 HH:mm:ss"));

4. 时间戳(秒 / 毫秒)

时间戳:当前时间距离 1970-01-01 00:00:00 的秒数 / 毫秒数,常用于跨平台时间传输。

cs 复制代码
DateTime now = DateTime.Now;
DateTimeOffset offset = new DateTimeOffset(now);

// 1. 时间 → 时间戳
long second = offset.ToUnixTimeSeconds();       // 秒
long millisecond = offset.ToUnixTimeMilliseconds(); // 毫秒

// 2. 时间戳 → 时间
DateTime time = DateTimeOffset.FromUnixTimeSeconds(1779347102).LocalDateTime;
Console.WriteLine(time);

三、时间对象的计算和比较

1. 时间加减计算

DateTime 提供专用方法计算时间,不会修改原时间,返回新时间

cs 复制代码
DateTime now = DateTime.Now;
// 加法
now = now.AddYears(1);    // 加1年
now = now.AddMonths(2);   // 加2月
now = now.AddDays(3);     // 加3天
now = now.AddHours(1);    // 加1小时
// 减法(传入负数)
now = now.AddYears(-1);   // 减1年

2. 时间比较

DateTime 支持直接用 > < == >= <= 比较(运算符重载):

cs 复制代码
if (DateTime.Now > new DateTime(2027, 5, 24))
{
    Console.WriteLine("已过指定日期");
}
else
{
    Console.WriteLine("未到指定日期");
}

3. 时间间隔(TimeSpan)

两个时间相减,得到 TimeSpan(时间差对象):

cs 复制代码
DateTime end = new DateTime(2026, 5, 21, 16, 0, 0);
TimeSpan span = end - DateTime.Now;

// 获取时间差分量
Console.WriteLine(span.Days);    // 天数
Console.WriteLine(span.Hours);   // 小时
Console.WriteLine(span.Minutes); // 分钟
Console.WriteLine(span.Seconds); // 秒

四、string 字符串常用方法(高频使用)

1. 字符串定义方式

cs 复制代码
// 1. 普通定义
string s1 = "Hello C#";

// 2. 换行转义 \r\n
string s2 = "第一行\r\n第二行";

// 3. @ 原样字符串(保留格式,无需转义)
string path = @"C:\Users\Desktop";

// 4. new 方式(重复字符)
string s3 = new string('c', 4); // "cccc"

2. 字符串常用操作方法

方法 作用 示例
string.Concat(a,b) 拼接多个字符串 string.Concat("张","三")→"张三"
string.Join(分隔符, 数组) 用分隔符连接字符串 string.Join("-","a","b")→"a-b"
ToLower() 转小写 "ABC".ToLower()→"abc"
ToUpper() 转大写 "abc".ToUpper()→"ABC"
StartsWith(值) 判断是否以指定字符开头 返回 bool
EndsWith(值) 判断是否以指定字符结尾 返回 bool
IndexOf(值) 查找字符索引,不存在返回 - 1 "abc".IndexOf("b")→1
Substring(起始,长度) 截取字符串 "abcde".Substring(1,2)→"bc"
Replace(旧,新) 替换字符 "abc".Replace("a","*")→"*bc"
Split(分隔符) 分割字符串为数组 "a-b-c".Split('-')→[a,b,c]
Trim() 去除首尾空格 " 张三 ".Trim()→"张三"
TrimEnd() 去除尾部空格 -

3. 完整示例

cs 复制代码
string str = " 尉氏县自来水污染上央视新闻 ";
// 去除空格
str = str.Trim();
// 判断开头
Console.WriteLine(str.StartsWith("尉"));
// 查找索引
Console.WriteLine(str.IndexOf("县"));
// 截取字符串
Console.WriteLine(str.Substring(3, 4));
// 替换
Console.WriteLine(str.Replace("污染", "**"));
// 分割
string arr = "a-b-c-d".Split('-');

总结

  1. 随机数 :日常用 Random(不写在循环内),唯一 ID 用 GUID,安全场景用加密随机数;
  2. DateTime :核心掌握获取时间、格式化、时间戳转换
  3. 时间计算 :用AddXXX方法加减,用TimeSpan计算时间差;
  4. 字符串Substring、Replace、Split、Trim、IndexOf是工作中最常用的方法。
相关推荐
天下无敌笨笨熊8 小时前
C#常用三方库使用心得
开发语言·c#
魔法阵维护师9 小时前
从零开发游戏需要学习的c#模块,第十三章(rpg小游戏入门,下篇,地图敌人与战斗触发)
学习·游戏·c#
月巴月巴白勺合鸟月半10 小时前
使用RAG完成一个基于本地的知识库的问答
c#
魔法阵维护师11 小时前
从零开发游戏需要学习的c#模块,第十八章(2D 碰撞检测与金币收集)
学习·游戏·c#
魔法阵维护师12 小时前
从零开发游戏需要学习的c#模块,第十二章(rpg小游戏入门,中篇,金币收集与ui显示)
学习·游戏·c#
魔法阵维护师12 小时前
从零开发游戏需要学习的c#模块,第十九章(在游戏画面里显示文字 —— FontStashSharp)
学习·游戏·c#
sinat_3671045613 小时前
WPF 常用控件
c#·xaml·控件·wfp
Artech13 小时前
[对比学习LangChain和MAF-03]完全不同的Agent设计哲学
python·ai·langchain·c#·agent·maf
xiaoshuaishuai813 小时前
C# CUDA 到 OpenCL 迁移
开发语言·windows·c#