2023-08-17 Untiy进阶 C#知识补充8——C#中的日期与时间

文章目录

        • 一、名词概念
        • 二、DateTime
        • 三、TimeSpan

一、名词概念

(一)格里高利历

​ 格里高利历一般指公元,即公历纪年法。目前我们所说公历,就是格里高利历。

​ 比如 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 年总秒数是 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

(一)初始化

public DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond);

​ 次要参数:

  • 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);   // 年、月、日、时、分、秒、毫秒print(dt.Ticks);     // 以格里高利历 00:00:00.000 年 1 月 1 日以来的 100 纳秒间隔数表示,一般是一个很大的数字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 nowTime3 = nowTime.AddDays(-1);
print(nowTime3.Day);

(四)字符串输出

// 默认输出格式
print(nowTime.ToString());          // "2023/8/17 22:55:35"
print(nowTime.ToShortTimeString()); // "22:55"
print(nowTime.ToShortDateString()); // "2023/8/17"
print(nowTime.ToLongTimeString());  // "22:55:35"
print(nowTime.ToLongDateString());  // "2023年8月17日"// 自定义输出格式
print(nowTime.ToString("D"));                       // "2023年8月17日"
print(nowTime.ToString("yyyy-MM-dd-ddd/HH-mm-ss")); // "2023-08-17-周四/22-55-35"

​ 自定义输出格式参照表 1 与表 2 示例:

表1 ToString() 参数示例
image-20230817225136862
表2 ToString() 用法示例
image-20230817225443895

(五)字符串转 DateTime

​ 字符串想要成功转回 DateTime,那么这个字符串的格式是有要求的。最基本的 ToString() 的转换出来的字符串才能转回去,格式必须如下:
年/月/日 时:分:秒

string str = "1988/5/4 18:00:08";DateTime dt3;
if (DateTime.TryParse(str, out dt3)) { // 尝试转换print(dt3);                        // 此处可以转换成功
}
else {print("转换失败");
}

(六)存储时间

​ 存储时间的方式很多:

  1. 直接存字符串
  2. 直接存 Ticks
  3. 直接存时间戳信息

​ 建议:存储时间戳的形式,更加节约。

三、TimeSpan

​ 命名空间:System

​ TimeSpan 是 C# 提供给我们的时间跨度结构体,用两个 DateTime 对象相减可以得到 TimeSpan 对象。

public TimeSpan(int days, int hours, int minutes, int seconds, int milliseconds);

TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1);print(ts.TotalMinutes); // 总分钟
print(ts.TotalSeconds); // 总秒数
print(ts.TotalDays);    // 总天数
print(ts.TotalHours);   // 总小时数
print(ts.Ticks);        // 总 Ticks,即多少个 100 nsprint(ts.Days + "-" + ts.Hours + "-" + ts.Minutes + "-" + ts.Seconds + "-" + ts.Milliseconds); // "19586-22-55-35-19"

(一)时间计算

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); // "1-1"

(二)Ticks 转 Seconds

long seconds = ts4.Ticks / TimeSpan.TicksPerSecond; // 自带常量方便用于和 ticks 进行计算

(三)存储时间

// 用当前时间加上 2 天,再减去 1970 年 1 月 1 日的时间。得到时间差
TimeSpan time = DateTime.Now.AddDays(2) - new DateTime(1970, 1, 1);// 再将该时间差转换为秒,便得到最终的时间戳,只需要存储该 long 变量即可
long timeStamp = (long)(time.Ticks / TimeSpan.TicksPerSecond);// 由于时间戳的单位为秒,将其乘以转换常量,转为为 ticks 的单位
TimeSpan time2 = new TimeSpan(timeStamp * TimeSpan.TicksPerSecond);// 再用 1970 年 1 月 1 日 + 该时间跨度,即可
DateTime date = new DateTime(1970, 1, 1) + time2;

​ 每次打开面板时计算目标时间和当前时间的秒数差,在面板中对显示内容进行更新。

​ 注意:不要在更新函数中不停用 DateTime.Now 来计算,浪费性能。只需要在面板打开时计算一次时间差,之后 用该时间差进行计算即可:

long seconds = (long)(date - DateTime.Now).TotalSeconds;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/76692.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电商商家花式整活,真蚌不住了

这年头,大数据永远比你自己更懂你,每个人手机里面的各种应用仿佛都是为自己量身定做的一般,总会准时准点推送你喜欢的内容。 我只是跟同事抱怨了一句“夏天太阳好晒”,转头淘宝就给我推防晒衣猜我喜欢?猜得很准&#…

NAS个人云存储 - 手把手教你搭建Nextcloud个人云盘并实现公网远程访问

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

Java面向对象三大特性之多态及综合练习

1.1 多态的形式 多态是继封装、继承之后,面向对象的第三大特性。 多态是出现在继承或者实现关系中的。 多态体现的格式: 父类类型 变量名 new 子类/实现类构造器; 变量名.方法名(); 多态的前提:有继承关系,子类对象是可以赋…

手写代码-前端面试

GitHub:手写代码集合

Git多版本并行开发实践

本文目的: 实现多个项目同时进行的git多版本管理工作流。 名词解释: feature-XXXX:特性分支指CCS中一个项目或者一个迭代,在该分支上开发,完成后,合并,最后,删除该分支,…

AutoHotKey+VSCode开发扩展推荐

原来一直用的大众推荐的SciTeAHK版,最近发现VSCode更舒服一些,有几个必装的扩展推荐一下: AutoHotkey Plus 请注意不是AutoHotkey Plus Plus。如果在扩展商店里搜索会有两个,一个是Plus,一个是Plus Plus。我选择Pllus&…

Spring的生命周期及Spring Bean单例和多例---超详细教学

一,何为spring生命周期 一个Bean对象从被Spring容器创建到被销毁的整个过程。Spring框架对Bean对象的生命周期进行了管理,提供了灵活性和控制权,让开发人员能够在不同的阶段进行自定义操作 1.1生命周期图 1.2.为什么要学习对象的生命周期…

遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型

近年来遥感技术得到了突飞猛进的发展,航天、航空、临近空间等多遥感平台不断增加,数据的空间、时间、光谱分辨率不断提高,数据量猛增,遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

[附源码]计算机毕业设计-JAVA火车票订票管理系统-springboot-论-文-ppt

PPT论文 文章目录 前言一、主要技术javaMysql数据库JSP技术 二、系统设计三、功能截图总结 前言 本论文主要论述了如何使用JAVA语言开发一个火车订票管理系统 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想…

【汇编语言】CS、IP寄存器

文章目录 修改CS、IP的指令转移指令jmp问题分析 修改CS、IP的指令 理论:CPU执行何处的指令,取决于CS:IP应用:程序员可以通过改变CS、IP中的内容,进行控制CPU即将要执行的目标指令;问题:如何改变CS、IP中的…

从零开始学习VBA(一)

前置配置设置 首先配置开发设置(不同版本的配置方法会有差异,可根据自己使用的EXCEL版本到网络上找对应的方法,比如直接搜索Excel2010 开发工具) 以下为excel2016配置方法: 操作路径:文件-选项-自定义功…

【内网监控】通过cpolar实现远程监控

【内网监控】通过cpolar实现远程监控 文章目录 【内网监控】通过cpolar实现远程监控前言1. 在cpolar官网预留一个空白隧道2. 完成空白数据隧道,生成地址3. 设置空白隧道的出口4. 空白数据隧道的出口设置5. 获取公网地址6. 打开本地电脑“远程桌面”7. 打开Windows自…