C# Random与DateTime

日之朝矣

Random

表示伪随机数生成器,这是一种能够产生满足某些随机性统计要求的数字序列的算法。

创建Random实例

1
2
3
4
Random random = new Random();

// 使用随机数种子创建(这里使用了当前的秒级时间戳作为随机种子)
Random random2 = new Random((int)DateTimeOffset.UtcNow.ToUnixTimeSeconds());

常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
public static void Main()
{
Random random = new Random();

byte[] bytes = new byte[5];
random.NextBytes(bytes); // 为一个 byte[] 填满随机的 byte 值,会覆盖原来所有的项(并未建立新数组)
Console.WriteLine("5 个随机的 byte 值");
foreach (byte byteValue in bytes)
Console.Write("{0, -6}", byteValue);
Console.WriteLine("\n");

Console.WriteLine("5 个随机的 int 值");
for (int i = 0; i < 5; i++)
Console.Write("{0, -15:N0}",random.Next()); // 产生一个随机整数,范围为 [0, Int32.MaxValue)
Console.WriteLine("\n");

Console.WriteLine("5 个随机的,范围在[0,10) int 值");
for (int i = 0;i < 5; i++)
Console.Write("{0, -2:N0}",random.Next(10)); // 产生一个随机整数,范围为 [0, 10)
Console.WriteLine("\n");

Console.WriteLine("5 个随机的,范围在[-5,5) int 值");
for(int i = 0; i < 5;i++)
Console.Write("{0, -4:N0}",random.Next(-5,5)); // 产生一个随机整数,范围为 [-5, 5)
Console.WriteLine("\n");

Console.WriteLine("4 个随机的 long 值,使用参数的话效果和 Next() 一样");
for(int i = 0; i < 4;i++)
Console.Write("{0, -28:N0}",random.NextInt64()); // 产生一个随机整数,范围为 [0, Int64.MaxValue),同样可指定范围
Console.WriteLine("\n");

Console.WriteLine("5 个随机的, float 值");
for (int i = 0; i < 5;i++)
Console.Write("{0, -12}",random.NextSingle()); // 产生一个随机float,范围为[0,1)
Console.WriteLine("\n");

Console.WriteLine("5 个随机的, double 值");
for (int i = 0; i< 5;i++)
Console.Write("{0, -21}",random.NextDouble()); // 产生一个随机double,范围为[0,1)
Console.WriteLine("\n");

Console.WriteLine("5 个随机的,[0,5) double 值,保留三位小数");
for (int ctr = 0; ctr <= 4; ctr++)
Console.Write("{0,-8:N3}", random.NextDouble() * 5);
Console.WriteLine("\n");


byte[] arrByte = random.GetItems(bytes,10); // 从指定的数组中取出指定个数的随机项。
Console.WriteLine("10 个从 bytes 数组中随机取出的值");
foreach (byte byteValue in arrByte)
Console.Write("{0, -6}", byteValue);
Console.WriteLine("\n");

random.Shuffle(arrByte); // 数组洗牌,用于打乱数组顺序
Console.WriteLine("洗牌 arrByte 数组");
foreach (byte byteValue in arrByte)
Console.Write("{0, -6}", byteValue);
Console.WriteLine("\n");

}

// output:
// 5 个随机的 byte 值
// 96 220 158 29 138
//
// 5 个随机的 int 值
// 12,998,639 544,476,182 22,369,250 386,258,266 1,394,041,754
//
// 5 个随机的,范围在[0,10) int 值
// 6 7 1 7 7
//
// 5 个随机的,范围在[-5,5) int 值
// 0 -1 -1 -4 -4
//
// 4 个随机的 long 值,使用参数的话效果和 Next() 一样
// 1,673,574,977,661,714,539 460,794,645,344,352,042 7,009,488,205,012,908,254 2,580,025,925,532,606,912
//
// 5 个随机的, float 值
// 0.9420624 0.6573419 0.47051913 0.93829465 0.71998346
//
// 5 个随机的, double 值
// 0.26227125498034587 0.66852426148318 0.6669249546882059 0.324175263578806 0.13457159120700168
//
// 5 个随机的,[0,5) double 值,保留三位小数
// 4.092 4.902 2.362 3.400 1.818
//
// 10 个从 bytes 数组中随机取出的值
// 96 29 138 138 96 96 220 158 29 96
//
// 洗牌 arrByte 数组
// 138 138 96 29 29 220 96 158 96 9

日期

DateTime 是 C# 中用于表示日期和时间的结构。它提供了丰富的方法和属性,可以用于日期和时间的计算、格式化、解析和操作。以下是对 DateTime 详细的介绍:

创建 DateTime 实例

使用构造函数

DateTime 提供了多个构造函数,可以用不同的方式来初始化日期和时间。

1
2
3
4
5
6
7
8
// 使用年、月、日初始化
DateTime date1 = new DateTime(2024, 7, 20);

// 使用年、月、日、小时、分钟、秒初始化
DateTime date2 = new DateTime(2024, 7, 20, 15, 30, 45);

// 使用年、月、日、小时、分钟、秒、毫秒初始化
DateTime date3 = new DateTime(2024, 7, 20, 15, 30, 45, 500);

使用静态属性

DateTime 提供了一些静态属性用于获取特定的日期和时间。

1
2
3
DateTime now = DateTime.Now;  // 获取当前的日期和时间
DateTime today = DateTime.Today; // 获取当前的日期,时间部分为 00:00:00
DateTime utcNow = DateTime.UtcNow; // 获取当前的协调世界时(UTC)日期和时间

常用属性

DateTime 结构提供了许多属性,可以用于获取日期和时间的不同部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
DateTime now = DateTime.Now;

int year = now.Year; // 获取年份
int month = now.Month; // 获取月份
DayOfWeek dayOfWeek = now.DayOfWeek; // 获取星期几
int day = now.Day; // 获取日
int hour = now.Hour; // 获取小时
int minute = now.Minute; // 获取分钟
int second = now.Second; // 获取秒
int millisecond = now.Millisecond; // 获取毫秒

int dayOfYear = now.DayOfYear; // 获取今天是今年的第几天
TimeSpan timOfDay = now.TimeOfDay; // 获取现在的时间 时分秒毫秒

常用方法

加减时间

可以使用 Add 方法系列来对日期和时间进行加减操作。

1
2
3
4
5
6
7
8
DateTime now = DateTime.Now;

DateTime future = now.AddDays(5); // 增加 5 天
DateTime past = now.AddHours(-3); // 减少 3 小时
DateTime nextYear = now.AddYears(1); // 增加 1 年
DateTime nextTime = now.Add(new TimeSpan(2,2,2,2,2)); // 增加2天2小时2分2秒2毫秒

DateTime pastYear = now.Subtract( Datetime对象或者TimeSpan对象 ) // 减少

比较日期和时间

可以使用 CompareTo 方法或比较运算符进行日期和时间的比较。

1
2
3
4
5
6
7
DateTime date1 = new DateTime(2024, 7, 20);
DateTime date2 = new DateTime(2024, 7, 21);

int comparison = date1.CompareTo(date2); // 返回 -1 表示 date1 早于 date2
bool isEqual = date1 == date2; // 返回 false
bool isEarlier = date1 < date2; // 返回 true
bool isLater = date1 > date2; // 返回 false

格式化日期和时间

可以使用 ToString 方法和格式字符串来格式化日期和时间。

1
2
3
4
5
DateTime now = DateTime.Now;

string dateString = now.ToString("yyyy-MM-dd"); // 格式化为 "2024-07-20"
string timeString = now.ToString("HH:mm:ss"); // 格式化为 "15:30:45"
string fullString = now.ToString("yyyy-MM-dd HH:mm:ss"); // 格式化为 "2024-07-20 15:30:45"

时间差

可以使用 TimeSpan 结构来表示和计算两个 DateTime 之间的时间差。

1
2
3
4
5
6
7
DateTime start = new DateTime(2024, 7, 20, 8, 0, 0);
DateTime end = new DateTime(2024, 7, 20, 17, 30, 0);

TimeSpan duration = end - start;

double totalHours = duration.TotalHours; // 获取总小时数
double totalMinutes = duration.TotalMinutes; // 获取总分钟数

日期和时间的解析

可以使用 ParseTryParse 方法将字符串解析为 DateTime

1
2
3
4
5
string dateString = "2024-07-20 15:30:45";
DateTime parsedDate = DateTime.Parse(dateString);

string invalidDateString = "invalid date";
bool success = DateTime.TryParse(invalidDateString, out DateTime result); // 返回 false,result 为 DateTime.MinValue

DateTime 的限制和注意事项

  • 最小值和最大值DateTime 具有静态属性 MinValueMaxValue,分别表示可以表示的最小和最大日期和时间。

    1
    2
    DateTime min = DateTime.MinValue;  // 0001-01-01 00:00:00
    DateTime max = DateTime.MaxValue; // 9999-12-31 23:59:59
  • 时区DateTime 不直接包含时区信息。如果需要处理时区相关的日期和时间,可以考虑使用 DateTimeOffset

时间戳的获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 当前 UTC 时间的 Unix 时间戳:
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); // 毫秒时间戳
DateTimeOffset.UtcNow.ToUnixTimeSeconds(); // 秒时间戳


// 本地时间的 Unix 时间戳,可以先获取本地时间再进行转换,

// 获取当前时间
DateTime now = DateTime.Now;

// 获取自 1970 年 1 月 1 日以来的时间间隔
DateTimeOffset dateTimeOffset = new DateTimeOffset(now);
long unixTimeSeconds = dateTimeOffset.ToUnixTimeSeconds();
long unixTimeMilliSeconds = dateTimeOffset.ToUnixTimeSeconds();
// 输出时间戳
Console.WriteLine("当前时间的 Unix 时间戳(以秒为单位): " + unixTimeSeconds)

参考内容

参考内容:

Microsoft Learn .NET API

菜鸟教程 - C# 教程

ChatGPT

  • 标题: C# Random与DateTime
  • 作者: 日之朝矣
  • 创建于 : 2024-07-30 12:53:27
  • 更新于 : 2024-08-18 09:25:27
  • 链接: https://blog.rzzy.fun/2024/07/30/csharp-random-and-datetime/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论