DateTime 相关的操作汇总【C# 基础】
〇、前言
在日常开发中,日期值当然是不可或缺的,能够清晰的在脑海中梳理出最快捷的实现也非常重要,那么今天就来汇总一下。
一、C# 中的本机时间以及格式化
如何取当前(本机)时间?很简单,一句话解决:
DateTime dt_now = DateTime.Now;
1.1 单字母格式化日期时间值
如下示例,将 ToString() 支持的单字母全部列出,并对比格式差异:
Console.WriteLine("“日本投降矣!”78 年前的今天,1945 年 8 月 15 日,铭记历史,吾辈自强!");
Console.WriteLine("付出了巨大牺牲的中国人民将坚定不移,捍卫用鲜血和生命写下的历史,捍卫来之不易的和平!");
Console.WriteLine($"_:{DateTime.Now} 默认格式"); // 默认格式就是 G 的格式
Console.WriteLine($"D:{DateTime.Now.ToString("D")}");
Console.WriteLine($"d:{DateTime.Now.ToString("d")}");
Console.WriteLine($"F:{DateTime.Now.ToString("F")}");
Console.WriteLine($"f:{DateTime.Now.ToString("f")}");
Console.WriteLine($"G:{DateTime.Now.ToString("G")}");
Console.WriteLine($"g:{DateTime.Now.ToString("g")}");
Console.WriteLine($"T:{DateTime.Now.ToString("T")}");
Console.WriteLine($"t:{DateTime.Now.ToString("t")}");
Console.WriteLine($"U:{DateTime.Now.ToString("U")}");
Console.WriteLine($"u:{DateTime.Now.ToString("u")}");
Console.WriteLine($"M:{DateTime.Now.ToString("M")}"); // M、m 格式相同
Console.WriteLine($"m:{DateTime.Now.ToString("m")}");
Console.WriteLine($"R:{DateTime.Now.ToString("R")}"); // R、r 格式相同
Console.WriteLine($"r:{DateTime.Now.ToString("r")}");
Console.WriteLine($"Y:{DateTime.Now.ToString("Y")}"); // Y、y 格式相同
Console.WriteLine($"y:{DateTime.Now.ToString("y")}");
Console.WriteLine($"O:{DateTime.Now.ToString("O")}"); // O、o格式相同
Console.WriteLine($"o:{DateTime.Now.ToString("o")}");
Console.WriteLine($"s:{DateTime.Now.ToString("s")}"); // 没有 S 格式

关于时间的几个概念了解:
| 名词 | 举例 | 备注 |
| 长时间(T) | 16:30:28 | 显示至 秒级 |
| 短时间(t) | 16:30 | 显示至 分钟级 |
| 长日期(D) | 2023年8月15日 | 汉字显示年月日 |
| 短日期(d) | 2023/8/15 | 反斜线代替汉字年月,没有小日 |
| 页面显示常用 = 长日期+长时间(F) | 2023年8月15日 16:30:28 | |
| 数据显示常用 = 短日期+长时间(G) | 2023/8/15 16:30:28 |
Console.WriteLine($"默认格式 {DateTime.Now}");
Console.WriteLine($"ToShortTimeString {DateTime.Now.ToShortTimeString()}");
Console.WriteLine($"ToLongTimeString {DateTime.Now.ToLongTimeString()}");
Console.WriteLine($"ToShortDateString {DateTime.Now.ToShortDateString()}");
Console.WriteLine($"ToLongDateString {DateTime.Now.ToLongDateString()}");
Console.WriteLine($"ToLocalTime {DateTime.Now.ToLocalTime()}");

1.2 日期时间精准格式化
如下示例,通过固定的日期格式指示字符,精准到日期时间的每一位显示:
Console.WriteLine("“日本投降矣!”78 年前的今天,1945 年 8 月 15 日,铭记历史,吾辈自强!");
Console.WriteLine("付出了巨大牺牲的中国人民将坚定不移,捍卫用鲜血和生命写下的历史,捍卫来之不易的和平!");
Console.WriteLine($"默认格式: :{DateTime.Now}");
Console.WriteLine($"yyyy-MM-dd HH:mm:ss.fffffff:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fffffff")}"); // 秒的小数位,最高精确到 7 位
Console.WriteLine($"yyyy-MM-dd HH:mm:ss.ffff :{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff")}"); // 秒的小数位小于 7 时,其他位数将自动截断
Console.WriteLine($"yyyy-MM-dd HH:mm:ss.f :{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.f")}");
Console.WriteLine($"yyyy-MM-dd HH:mm:ss :{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}"); // HH:二十四小时制
Console.WriteLine($"yyyy-MM-dd hh:mm:ss :{DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")}"); // hh:十二小时制
Console.WriteLine($"yyyyy-MMMM-dddd HH:mm:ss :{DateTime.Now.ToString("yyyyy-MMMM-dddd HH:mm:ss")}");
Console.WriteLine($"yyyy-MMM-ddd H:m:s :{DateTime.Now.ToString("yyyy-MMM-ddd H:m:s")}");
Console.WriteLine($"y-M-d H:m:s :{DateTime.Now.ToString("y-M-d H:m:s")}");

| 年份 | y(1~5 位) |
|
| 月份 | M(1~4 位) |
|
| 天 | d(1~4 位) |
|
| 时 |
h(1~2 位) H(1~2 位) |
|
| 分 | m(1~2 位) |
|
| 秒 | s(1~2 位) |
|
| 秒的小数位 | f(1~7 位) |
|
参考:https://www.cnblogs.com/yohen/articles/1565833.html
1.3 日期时间的加、减操作
DateTime dt_example = Convert.ToDateTime("2023-08-15 10:10:10.1000000");
// DateTime dt_example = DateTime.Parse("2023-08-15 10:10:10.1000000");
Console.WriteLine($"默认格式 {dt_example.ToString("yyyy-MM-dd HH:mm:ss.fffffff")}");
Console.WriteLine($"AddYears1 {dt_example.AddYears(1).ToString("yyyy-MM-dd HH:mm:ss.fffffff")}");
Console.WriteLine($"AddYears-1 {dt_example.AddYears(-1).ToString("yyyy-MM-dd HH:mm:ss.fffffff")}");
Console.WriteLine($"AddMonths {dt_example.AddMonths(1).ToString("yyyy-MM-dd HH:mm:ss.fffffff")}");
Console.WriteLine($"AddDays {dt_example.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss.fffffff")}");
Console.WriteLine($"AddHours {dt_example.AddHours(1).ToString("yyyy-MM-dd HH:mm:ss.fffffff")}");
Console.WriteLine($"AddMinutes {dt_example.AddMinutes(1).ToString("yyyy-MM-dd HH:mm:ss.fffffff")}");
Console.WriteLine($"AddSeconds {dt_example.AddSeconds(1).ToString("yyyy-MM-dd HH:mm:ss.fffffff")}");
Console.WriteLine($"AddMilliseconds {dt_example.AddMilliseconds(1).ToString("yyyy-MM-dd HH:mm:ss.fffffff")}");
Console.WriteLine($"AddMicroseconds1 {dt_example.AddMicroseconds(1).ToString("yyyy-MM-dd HH:mm:ss.fffffff")}");
Console.WriteLine($"AddMicroseconds-1 {dt_example.AddMicroseconds(-1).ToString("yyyy-MM-dd HH:mm:ss.fffffff")}");

1.4 取日期时间的单个值
取值的结果均为 int 类型。
DateTime dt_example = DateTime.Parse("2023-08-15 10:10:10.1234567");
Console.WriteLine($"Year {dt_example.Year}");
Console.WriteLine($"Month {dt_example.Month}");
Console.WriteLine($"Day {dt_example.Day}");
Console.WriteLine($"Hour {dt_example.Hour}");
Console.WriteLine($"Minute {dt_example.Minute}");
Console.WriteLine($"Second {dt_example.Second}");
Console.WriteLine($"Millisecond {dt_example.Millisecond}");
Console.WriteLine($"Microsecond {dt_example.Microsecond}");

参考: https://www.cnblogs.com/lida/archive/2011/01/02/1924197.html
二、北京时间与协调世界时
2.1 时间概念的分类
当前时间大概可以分为三类:
- 协调世界时:就是世界标准时间,这个时间在任何人看来都是相同的。
- 北京时间:中国标准时间,是根据时区划分,北京为东八区而得来。
- 本机时间:这个一般参考北京时间,不确定性比较大了,可以自行设置和校准,存在误差的可能性较大。
下面来看下详解:
2.1.1 协调世界时(UTC)
协调世界时又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称 UTC。
协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。
国际原子时的准确度为每日数纳秒,而世界时的准确度为每日数毫秒。许多应用部门要求时间系统接近世界时 UT,对于这种情况,一种称为协调世界时的折中时标于 1972 年面世。为确保协调世界时与世界时相差不会超过0.9秒,在有需要的情况下会在协调世界时内加上正或负闰秒。因此协调世界时与国际原子时之间会出现若干整数秒的差别,两者之差逐年积累,便采用跳秒(闰秒)的方法使协调时与世界时的时刻相接近,其差不超过1s。它既保持时间尺度的均匀性,又能近似地反映地球自转的变化。按国际无线电咨询委员会(CCIR)通过的关于 UTC 的修正案,从 1972 年 1 月 1 日起 UTC 与 UT1(在UT中加入极移改正得到)之间的差值最大可以达到 ±0.9s。位于巴黎的国际地球自转事务中央局负责决定何时加入闰秒。一般会在每年的 6 月 30 日、12 月 31 日的最后一秒进行调整。
这套时间系统被应用于许多互联网和万维网的标准中,例如,网络时间协议就是协调世界时在互联网中使用的一种方式。
在 C# 中,有一个专门的类 DateTimeOffset,用来标识 UTC 时间。
static void Main(string[] args)
{
Console.WriteLine($"DateTime.Now: {DateTime.Now}");
Console.WriteLine($"DateTime.Now.ToUniversalTime(): {DateTime.Now.ToUniversalTime()}");
Console.WriteLine($"DateTime.UtcNow: {DateTime.UtcNow}");
Console.WriteLine($"new DateTimeOffset(DateTime.UtcNow): {new DateTimeOffset(DateTime.UtcNow)}");
Console.WriteLine($"new DateTimeOffset(DateTime.UtcNow).ToUniversalTime():{new DateTimeOffset(DateTime.UtcNow).ToUniversalTime()}");
Console.WriteLine($"new DateTimeOffset(DateTime.Now): {new DateTimeOffset(DateTime.Now)}");
Console.WriteLine($"new DateTimeOffset(DateTime.Now).ToUniversalTime(): {new DateTimeOffset(DateTime.Now).ToUniversalTime()}");
Console.ReadLine();
}

2.1.2 本机时间
本机时间就是最常用的时间了,代码中通过DateTime.Now获取。
本机时间容易存在不准时的情况,因为本机时间不一定和标准时间同步。
2.1.3 北京时间
我国的标准时区:UTC/GMT +8.00 (东八区)。
因为北京处于国际时区划分中的东八区,同格林尼治时间(世界时)整整相差8小时(即北京时间 = 协调世界时+8 小时),故命名为“北京时间”。
授时台必须建在地理中心地带,中国东西相跨 5 个时区(即东五区、东六区、东七区、东八区、东九区5个时区),从而也就产生了长短波授。“北京时间”与“北京当地时间”是两个概念,“北京时间”的发播不在北京,而是由陕西省渭南市蒲城县(处于东七区)的中国科学院国家授时中心发播。
中国科学院国家授时中心台本部位于陕西省西安市临潼区。中国科学院国家授时中心授时部(二部)位于陕西省渭南市蒲城县,两地虽处于东七区,但全国统一使用北京时间,负责发布北京时间,而非当地的地方时。
2.2 通过取网络时间来测试一下
下面来测试下看看(测试机时区选择的是:尤克拉 UTC+08:45):
注意:DateTime.Parse()和Convert.ToDateTime()都是将时间字符串,按照本机配置的时区,转换为 DateTime 类型。
static void Main(string[] args)
{
// 通过 HTTP 响应取标准时间
HttpClient client = new HttpClient();
using HttpResponseMessage response = client.GetAsync("https://cn.bing.com/").Result; // 此处网站地址可随意调换
var ddd= response.Headers.Date;
string dstr00 = ddd.ToString(); // 2023/8/17 6:10:35 +00:00
Console.WriteLine($"dstr00: {dstr00}");
Console.WriteLine($"DateTime.Parse(dstr00): {DateTime.Parse(dstr00)}");
Console.WriteLine($"Convert.ToDateTime(dstr00):{Convert.ToDateTime(dstr00)}");
Console.WriteLine();
string dstr08 = ddd.ToString().Replace(" +00:00", " +08:00"); // 2023/8/17 6:10:35 +08:00
Console.WriteLine($"dstr08: {dstr08}");
Console.WriteLine($"DateTime.Parse(dstr08): {DateTime.Parse(dstr08)}");
Console.WriteLine($"Convert.ToDateTime(dstr08):{Convert.ToDateTime(dstr08)}");
Console.WriteLine();
string dstr = ddd.ToString().Replace(" +00:00", ""); // 2023/8/17 6:10:35
Console.WriteLine($"dstr : {dstr}");
Console.WriteLine($"DateTime.Parse(dstr): {DateTime.Parse(dstr)}");
Console.WriteLine($"Convert.ToDateTime(dstr): {Convert.ToDateTime(dstr)}");
Console.WriteLine();
Console.WriteLine($"DateTime.Now: {DateTime.Now}");
Console.ReadLine();
}
当时间字符串的时区标识为“+00:00”,说明时间是协调世界时,转换成本地当前时间时,自动按照当前时区“+08:45”,则结果就是::UTC+08:45:00。
当时间字符串的时区标识为“+08:00”,说明时间是协调世界时加 8 小时,转换成本地当前时间时,自动按照当前时区“+08:45”,则结果就是:UTC+00:45:00。

另外,还可以通过下面代码来取 UTC:
DateTime timeUtc = DateTime.UtcNow;
// 或者
DateTime timeUtc = DateTime.Now.ToUniversalTime();
这两种方法的优点就是方便快捷,但是时间是以本机时间为准的,会有不准确的风险。
通过网络方式取时间,虽然准确度较高,但是由于需要发送网络请求,因此也会受网络情况的影响,因此在使用时要按需选择。
三、时间戳
时间戳(TimeStamp),通常是一个字符序列,唯一地标识某一刻的时间。数字时间戳技术是数字签名技术一种变种的应用。
在计算机中,时间戳一般是指 Unix 时间戳,即自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00.000)到当前时间的秒/毫秒/微秒数。
下面简单列举几种时间戳和时间互相转换的方法:
3.1 通过类 DateTimeOffset 互相转换
时间转时间戳:
static void Main(string[] args)
{
Console.WriteLine($"DateTime.Now: {DateTime.Now}");
Console.WriteLine($"DateTime.UtcNow: {DateTime.UtcNow}");
Console.WriteLine($"new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds(): {new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"); // 秒
Console.WriteLine($"new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds(): {new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds()}"); // 毫秒
Console.WriteLine($"new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds():{new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds()}"); // 微秒
Console.ReadLine();
}

时间戳转时间:
public static DateTime GetTimeByTimeStamp(long timestamp)
{
DateTime dt_back = DateTimeOffset.FromUnixTimeSeconds(timestamp).LocalDateTime; // 秒
//DateTime dt_back = DateTimeOffset.FromUnixTimeMilliseconds(timestamp).LocalDateTime; // 毫秒
return dt_back;
}
3.2 通过时间差互相转换
时间转时间戳:
public static long GetTimeStamp(DateTime starttime)
{
TimeSpan ts = starttime.ToUniversalTime() - new DateTime(1970, 1, 1); // ToUniversalTime():将时间转换为 UTC
long timestamp = (long)ts.TotalSeconds; // 秒 10 位
//long time = (long)ts.TotalMilliseconds; // 毫秒 13 位
//long time = (long)ts.TotalMicroseconds; // 微秒 16 位
return timestamp;
}
时间戳转时间:
public static DateTime GetTimeByTimeStamp(long timestamp)
{
DateTime startTime = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(1970, 1, 1), TimeZoneInfo.Local); // TimeZoneInfo.Local:本机时区
DateTime dt_back = startTime.AddSeconds(timestamp); // 秒
//DateTime dt_back = startTime.AddMilliseconds(timestamp); // 毫秒
//DateTime dt_back = startTime.AddMicroseconds(timestamp); // 微秒
return dt_back;
}
3.3 通过 Ticks 取时间戳
Ticks 是时间从 Unix 纪元开始,至开始时间的最小粒度总数,由于秒可以分为 1000,0000 份,因此总粒度除于 1000,0000,得到总的秒数。
public static long GetTimeStamp(DateTime starttime)
{
long timestamp = (starttime.ToUniversalTime().Ticks - 621355968000000000) / 10000000; // 秒 10 位
//long timestamp = (starttime.ToUniversalTime().Ticks - 621355968000000000) / 10000; // 毫秒 13 位
return timestamp;
}
注:本文示例都是通过验证的,有觉不准确或有疑问欢迎留言,有更好的方法实践请不吝赐教。
DateTime 相关的操作汇总【C# 基础】的更多相关文章
- Mac Python相关配置操作汇总
以下总结一下我在安装pytorch时用到的一些命令及操作,方便以后回顾 一.Which xxxx 直接查找到xxxx所在的路径.如下: which python python: aliased to ...
- Oracle知识梳理(三)操作篇:SQL基础操作汇总
Oracle知识梳理(三)操作篇:SQL基础操作汇总 一.表操作 1.表的创建(CREATE TABLE): 基本语句格式: CREATE TABLE table_name ( col_ ...
- SQL基础操作汇总
SQL基础操作汇总 一.表操作 1.表的创建(CREATE TABLE): 基本语句格式: CREATE TABLE table_name ( col_name datatype, -- ...
- day06-Python运维开发基础(字符串格式化与相关的函数、列表相关的操作)
1. 字符串相关的操作与格式化 # ### 字符串相关操作 # (1)字符串的拼接 + var1 = "亲爱的," var2 = "男孩" res = var1 ...
- SQL字符串操作汇总
SQL字符串操作汇总 --将字符串中从某个字符开始截取一段字符,然后将另外一个字符串插入此处 select stuff('hello,world!',4,4,'****') --返回值hel*** ...
- Android UI相关开源项目库汇总
最近做了一个Android UI相关开源项目库汇总,里面集合了OpenDigg 上的优质的Android开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个st ...
- solidity的delete操作汇总
简介 Solidity中的特殊操作符delete用于释放空间,为鼓励主动对空间的回收,释放空间将会返还一些gas. delete操作符可以用于任何变量,将其设置成默认值0. 删除枚举类型时,会将其值重 ...
- Java代码 简单用于处理和数据库相关的操作
package util; import org.apache.commons.beanutils.BeanUtils; import java.lang.reflect.InvocationTarg ...
- 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的生命周期和程序的生命周期
[源码下载] 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的 ...
- 关于C#和ASP.NET中对App.config和Web.config文件里的[appSettings]和[connectionStrings]节点进行新增、修改、删除和读取相关的操作
最近我做的一些项目,经常需要用到对应用程序的配置文件操作,如app.config和web.config的配置文件,特别是对配置文件中的[appSettings]和[connectionStrings] ...
随机推荐
- 2022-07-26:以下go语言代码输出什么?A:5;B:hello;C:编译错误;D:运行错误。 package main import ( “fmt“ ) type integer in
2022-07-26:以下go语言代码输出什么?A:5:B:hello:C:编译错误:D:运行错误. package main import ( "fmt" ) type inte ...
- 2022-03-23:在k进制下,最小多小的num,可以让1~num范围的数拥有1的个数不少于n个? 腾讯音乐2022校园招聘。
2022-03-23:在k进制下,最小多小的num,可以让1~num范围的数拥有1的个数不少于n个? 腾讯音乐2022校园招聘. 答案2022-03-23: 二分法. 代码用golang编写.代码如下 ...
- 17.AQS中的Condition是什么?
欢迎关注:王有志 期待你加入Java人的提桶跑路群:共同富裕的Java人 今天来和大家聊聊Condition,Condition为AQS"家族"提供了等待与唤醒的能力,使AQS&q ...
- springboot 分析源码欢迎页和图标-> thymeleaf模板引擎常用语法->扩展
欢迎页: icon: 注意点: thymeleaf模板引擎 1.使用thymeleaf模板引擎前要导入对应依赖包 2.阅读源码: 根据源码说明我们可以将html文件放置在templates目录下,然 ...
- 【HarmonyOS】元服务和APP的相互跳转、相互成就
[关键字] 卡片.跳转.加桌 [背景介绍] 随着鸿蒙生态的发展,各种类型的应用都已经可以在Harmony OS上无差异的运行,面对鸿蒙新兴元服务的兴起,各大厂家可能都在考虑一个问题:如果已经有AP ...
- Microsoft Office 2019 官方镜像下载 仅支持Win10系统
Office 2019 专业增强版:(注:这是一个镜像文件) http://officecdn.microsoft.com/pr/492350f6-3a01-4f97-b9c0-c7c6ddf67d6 ...
- 算法基础(一):串匹配问题(BF,KMP算法)
好家伙,学算法, 这篇看完,如果没有学会KMP算法,麻烦给我点踩 希望你能拿起纸和笔,一边阅读一边思考,看完这篇文章大概需要(20分钟的时间) 我们学这个算法是为了解决串匹配的问题 那什么是串匹配 ...
- 一分钟学一个 Linux 命令 - find 和 grep
前言 大家好,我是 god23bin.欢迎来到<一分钟学一个 Linux 命令>系列,每天只需一分钟,记住一个 Linux 命令不成问题.今天需要你花两分钟时间来学习下,因为今天要介绍的是 ...
- Linux安装MongoDB 4.0.3
Linux安装MongoDB 4.0.3 1.准备 CentOS下安装MongoDB 官网提供windows.Linux.OSX系统环境下的安装包,这里主要是记录一下在Linux下的安装.首先到官 ...
- CSR格式如何更新? GES图计算引擎HyG揭秘之数据更新
摘要:HyG图计算引擎采用CSR格式来存储图的拓扑信息,CSR格式可以将稀疏矩阵的存储空间压缩,进而大大降低图的存储开销,同时具备访问效率高.格式易转化等优点. 本文分享自华为云社区<CSR格式 ...