C#中日期和时间的处理

目录

前言

时间对于我们的作用

一些关于时间的名词说明

格里高利历

格林尼治时间(GMT)

协调世界时(UTC)

时间戳

DateTime

初始化

获取时间

计算时间

字符串转DateTime

存储时间

TimeSpan

初始化它来代表时间间隔

用它相互计算

自带常量方便用于和ticks进行计算

总结


前言

在C#编程环境中,日期和时间的处理是编程任务中不可或缺的一部分。无论是构建企业级应用、游戏开发,还是进行数据分析,准确地处理日期和时间都是确保程序稳定性和用户体验的关键。C#语言提供了强大的日期和时间处理功能,使得开发者能够高效地处理各种日期和时间相关的需求。

时间对于我们的作用

在游戏开发当中我们经常会有和时间打交道的内容

比如每日签到、活动倒计时、建造时间、激活时间等等的功能

如果想要完成这些功能,仅仅用Unity提供给我们的Time类是远远不够用的

所以我们需要学习专门的日期和时间相关的知识

才能制作某些功能需求

而C#便提供了对应的结构方便我们处理时间相关逻辑

1.DateTime 日期结构体
2.TimeSpan 时间跨度结构体


一些关于时间的名词说明

1s秒 = 1000ms毫秒

1ms毫秒 = 1000μs微妙

1μs微妙 = 1000ns纳秒

格里高利历

格里高利历一般指公元

公元,即公历纪年法

目前我们所说公历,就是格里高利历

比如2022年就是从公元元年开始算起的两千二十二年

格林尼治时间(GMT)

格林尼治标准时间

是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线

地球每天的自转是有些不规则的,而且正在缓慢减速

所以,格林尼治时间已经不再被作为标准时间使用

现在的标准时间──协调世界时(UTC)

协调世界时(UTC)

又称世界统一时间、世界标准时间、国际协调时间

UTC协调世界时即格林尼治平太阳时间,是指格林尼治所在地的标准时间,

也是表示地球自转速率的一种形式

UTC基于国际原子时间,通过不规则的加入闰秒来抵消地球自转变慢的影响,是世界上调节时钟和时间的主要时间标准

时间戳

从1970年1月1日(UNIX时间戳的起点时间)到现在的时间

计算机时间和众多的编程语言的时间都是从1970年1月1日开始算起

是因为很多编程语言起源于UNIX系统,而UNIX系统认为1970年1月1日0点是时间纪元

所以我们常说的UNIX时间戳是以1970年1月1日0点为计时起点时间的,

原因:

最初计算机操作系统是32位,而时间也是用32位表示

我们知道32位能代表的最大十进制数是2147483647

1年是365天,总秒数是3153 6000

那么2147483647 / 3153 6000 = 68.1年
也就是说因为早期用32位来表示时间,最大的时间间隔是68年
而最早出现的UNIX操作系统考虑到计算机产生的年代和应用的
时限综合取了1970年1月1日作为UNIX TIME的纪元时间(开始时间)


DateTime

命名空间:System

DateTime 是 C# 提供给我们处理日期和时间的结构体

DateTime 对象的默认值和最小值是0001年1月1日00:00:00(午夜)

最大值可以是9999年12月31日晚上11: 59:59

初始化

主要参数:

年、月、日、时、分、秒、毫秒

ticks:以格里高利历00: 00:00.000年1月1日以来的100纳秒间隔数表示,一般是一个很大的数字

次要参数:

DateTimeKind:日期时间种类

Local:本地时间

Utc:UTC时间

Unspecified:不指定

Calendar:日历

使用哪个国家的日历,一般在Unity开发中不使用

DateTime dt = new DateTime(2022, 12, 1, 13, 30, 45, 500);

//年、月、日、时、分、秒、毫秒

print(dt.Year + "-" + dt.Month + "-" + dt.Day + "-" + dt.Hour + "-" + dt.Minute + "-" + dt.Second + "-" + dt.Millisecond);

//以格里高利历00:00:00.000年1月1日以来的100纳秒间隔数表示,一般是一个很大的数字

print(dt.Ticks);

//一年的第多少天

print(dt.DayOfYear);

//星期几

print(dt.DayOfWeek);

获取时间

//当前日期和时间

DateTime nowTime = DateTime.Now;

print(nowTime.Minute);

//返回今日日期

DateTime nowTime2 = DateTime.Today;

print(nowTime2.Year + "-" + nowTime2.Month + "-" + nowTime2.Day);

//返回当前UTC日期和时间

DateTime nowTimeUTC = DateTime.UtcNow;

计算时间

//各种加时间

DateTime nowTime3 = nowTime.AddDays(-1);

print(nowTime3.Day);

字符串转DateTime

字符串想要转回DateTime成功的话

那么这个字符串的格式是有要求的 一定是最基本的 toString的转换出来的字符串才能转回去

年/月/日 时:分:秒

string str = nowTime.ToString();

str = "1988/5/4 18:00:08";

print(str);

DateTime dt3;

if(DateTime.TryParse(str, out dt3))

{

print(dt3);

}

else

{

print("转换失败");

}

存储时间

存储时间 方式很多

1.以直接存字符串

2.可以直接存Ticks

3.可以直接存时间戳信息

存储时间戳的形式 更加节约

TimeSpan

命名空间:System

TimeSpan 是 C# 提供给我们的时间跨度结构体

用两个DateTime对象相减 可以得到该对象

TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1);

print(ts.TotalMinutes);

print(ts.TotalSeconds);

print(ts.TotalDays);

print(ts.TotalHours);

print(ts.Ticks);

print(ts.Days + "-" + ts.Hours + "-" + ts.Minutes + "-" + ts.Seconds + "-" + ts.Milliseconds);

初始化它来代表时间间隔

TimeSpan ts2 = new TimeSpan(1,0,0,0);

DateTime timeNow = DateTime.Now + ts2;

用它相互计算

TimeSpan ts3 = new TimeSpan(0, 1, 1, 1);

TimeSpan ts4 = ts2 + ts3;

print(ts4.Days + "-" + ts4.Hours);

自带常量方便用于和ticks进行计算

print(ts4.Ticks / TimeSpan.TicksPerSecond);


总结

在游戏开发中,合理使用DateTime和TimeSpan结构体可以高效地处理各种日期和时间需求。了解它们的初始化、属性和方法,以及它们之间的关系和转换,是掌握C#中日期和时间处理的关键。同时,根据具体需求选择合适的存储方式,也是实现高效时间处理的重要一环。

相关推荐
计算机学姐12 分钟前
基于Python的高校成绩分析管理系统
开发语言·vue.js·后端·python·mysql·pycharm·django
VertexGeek14 分钟前
Rust学习(三):rust基础Ⅱ
开发语言·学习·rust
一个数据小开发20 分钟前
业务开发问题之ConcurrentHashMap
java·开发语言·高并发·map
三小尛1 小时前
插入排序(C语言)
c语言·开发语言
南宫理的日知录1 小时前
106、Python并发编程:深入浅出理解线程池的内部实现原理
开发语言·python·学习·编程学习
WolvenSec1 小时前
C/C++逆向:结构体逆向分析
c语言·开发语言·c++·网络安全
谢尔登1 小时前
前端开发调试之 PC 端调试
开发语言·前端
每天吃饭的羊1 小时前
在循环中只set一次
开发语言·前端·javascript
江梦寻3 小时前
解决SLF4J: Class path contains multiple SLF4J bindings问题
java·开发语言·spring boot·后端·spring·intellij-idea·idea
不脱发的牧码人3 小时前
C#中Task和Thread的全解析
c#·多线程·thread·task