C#.NET DateTime 最强入门到进阶:格式化、转换、UTC、时区全覆盖

作者:唐青枫日期:2025/11/19

简介

DateTimeSystem 命名空间中用于表示日期和时间的结构体,广泛用于处理时间相关的操作,如存储、计算、格式化等。

DateTime 结构概述

  • 定义:System.DateTime 是一个值类型(struct),表示自公元 0001 年 1 月 1 日午夜 00:00:00(DateTime.MinValue)起经过的“刻度”(ticks,1 tick = 100 纳秒)数。
  • 内部存储:一个 long 值(ticks)+ 一个 DateTimeKind 枚举,指示时间的“种类”:
    • Unspecified:未指定是本地还是 UTC
    • Utc:协调世界时
    • Local:本地时区时间
  • 范围:DateTime.MinValue(0001-01-01),DateTime.MaxValue(9999-12-31 23:59:59.9999999)
1// 时间单位转换
21= 10,000,000 Ticks
31 毫秒 = 10,000 Ticks
41 分钟 = 600,000,000 Ticks
5

主要功能

表示日期和时间:

  • 包含年、月、日、时、分、秒、毫秒。
  • 支持 Kind 属性(Utc、Local、Unspecified)。

时间操作:

  • 比较:Compare、CompareTo
  • 运算:加减时间(AddDays、AddHours 等)。
  • 时间差:Subtract 返回 TimeSpan

格式化:

转换:

  • 与字符串、Unix 时间戳、数据库时间互转。

静态属性:

  • DateTime.Now:本地时间。
  • DateTime.UtcNowUTC 时间。
  • DateTime.Today:当前日期(时间为 00:00:00)。

核心属性

属性说明
Now返回本地时区当前时间
UtcNow返回 UTC 当前时间
Today返回本地时区当前日期(00:00:00 时分秒)
Date取当前实例的日期部分,时间部分置 00:00:00
Year, Month, Day年、月、日
Hour, Minute, Second, Millisecond小时、分钟、秒、毫秒
DayOfWeek星期枚举(DayOfWeek.Monday…)
DayOfYear年内天数(1–366)
Kind时间种类(Utc/Local/Unspecified)
Ticks自 0001-01-01 00:00:00 起的刻度数(100ns 为单位)
1var dt = DateTime.Now;
2Console.WriteLine($"{dt.Year}-{dt.Month}-{dt.Day} {dt.Hour}:{dt.Minute}:{dt.Second}, Kind={dt.Kind}");
3

构造与转换

构造器

1// 指定年月日时分秒
2var dt1 = new DateTime(2025, 8, 8, 14, 30, 0);
3
4// 指定 Kind
5var dt2 = new DateTime(2025,8,8,14,30,0, DateTimeKind.Utc);
6

从 ticks

1var dtTicks = new DateTime(637632000000000000L);
2

与 Unix 时间戳

1// DateTime <-> Unix seconds
2var unixEpoch = DateTimeOffset.FromUnixTimeSeconds(0).UtcDateTime;
3long toUnix = ((DateTimeOffset)DateTime.UtcNow).ToUnixTimeSeconds();
4

与 DateTimeOffset

  • DateTimeOffset 推荐用于跨时区场景,包含一个偏移量字段,且不朴素依赖 Kind
  • DateTime 转换:
1var dto = new DateTimeOffset(dt);              // 按本地偏移
2var dtoUtc = new DateTimeOffset(dt, TimeSpan.Zero);
3

特殊日期获取

1DateTime today = DateTime.Today; // 今天的午夜时间
2DateTime min = DateTime.MinValue;
3DateTime max = DateTime.MaxValue;
4DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
5

DateTimeKind 与时区处理

DateTimeKind 枚举

1public enum DateTimeKind
2{
3    Unspecified = 0, // 未指定时区(默认)
4    Utc = 1,         // UTC时间
5    Local = 2        // 本地时间
6}
7

时区转换最佳实践

1// 创建带时区信息的时间
2DateTime utcTime = new DateTime(2023, 10, 1, 0, 0, 0, DateTimeKind.Utc);
3DateTime localTime = new DateTime(2023, 10, 1, 8, 0, 0, DateTimeKind.Local);
4
5// 时区转换
6TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
7
8// UTC转本地时间
9DateTime utcToChina = TimeZoneInfo.ConvertTimeFromUtc(utcTime, tz);
10
11// 本地时间转UTC
12DateTime chinaToUtc = TimeZoneInfo.ConvertTimeToUtc(localTime, tz);
13
14// 跨时区转换
15TimeZoneInfo nyTz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
16DateTime chinaToNy = TimeZoneInfo.ConvertTime(localTime, tz, nyTz);
17

格式化与解析

标准格式化字符串

格式符说明示例输出
"d"短日期2023-06-15
"D"长日期2023年6月15日
"t"短时间14:30
"T"长时间14:30:45
"f"完整日期/时间2023年6月15日 14:30
"F"完整格式2023年6月15日 14:30:45
"g"常规短格式2023-06-15 14:30
"G"常规长格式2023-06-15 14:30:45
"s"可排序格式2023-06-15T14:30:45
"u"通用可排序2023-06-15 14:30:45Z
"U"UTC完整格式2023年6月15日 6:30:45

格式化

  • 标准格式
1dt.ToString("o");  // ISO 8601 完整格式:2025-08-08T14:30:00.0000000Z
2dt.ToString("s");  // 可排序格式:2025-08-08T14:30:00
3dt.ToString("G");  // 默认长日期+长时间
4dt.ToString("d");       // "2023/10/1"(短日期)
5dt.ToString("D");       // "2023年10月1日"(长日期)
6dt.ToString("t");       // "14:30"(短时间)
7dt.ToString("T");       // "14:30:00"(长时间)
8
  • 自定义格式
1dt.ToString("yyyy-MM-dd HH:mm:ss");      // 2025-08-08 14:30:00
2dt.ToString("yyyy-MM-dd HH:mm:ss.fff");  // 带毫秒
3dt.ToString("dddd, MMM d yyyy");         // 星期几, 月 日 年
4

解析

  • Parse / TryParse
1DateTime.Parse("2025-08-08 14:30");
2DateTime.TryParse("2025-08-08", out var dt);
3
  • 指定格式解析
1DateTime.ParseExact("08/08/2025", "MM/dd/yyyy", CultureInfo.InvariantCulture);
2DateTime.TryParseExact(input, new[] {"yyyy-MM-dd","MM/dd/yyyy"}, 
3                       CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
4

日期时间组件访问

属性访问

1DateTime dt = new DateTime(2023, 10, 5, 14, 30, 45, 123);
2
3int year = dt.Year;       // 2023
4int month = dt.Month;     // 10
5int day = dt.Day;         // 5
6int hour = dt.Hour;       // 14
7int minute = dt.Minute;   // 30
8int second = dt.Second;   // 45
9int millisecond = dt.Millisecond; // 123
10long ticks = dt.Ticks;    // 638,000,000,000,000,000 + ...
11
12DayOfWeek dayOfWeek = dt.DayOfWeek; // DayOfWeek.Thursday
13int dayOfYear = dt.DayOfYear;       // 278 (10月5日是2023年第278天)
14

日期计算辅助

1DateTime dt = new DateTime(2023, 2, 15);
2
3// 获取月份天数
4int daysInFeb = DateTime.DaysInMonth(2023, 2); // 28
5
6// 判断闰年
7bool isLeap2023 = DateTime.IsLeapYear(2023); // false
8bool isLeap2024 = DateTime.IsLeapYear(2024); // true
9
10// 获取月份首日和末日
11DateTime firstDayOfMonth = new DateTime(dt.Year, dt.Month, 1);
12DateTime lastDayOfMonth = new DateTime(dt.Year, dt.Month, 
13    DateTime.DaysInMonth(dt.Year, dt.Month));
14

日期时间运算与比较

算术运算

1DateTime now = DateTime.Now;
2
3// 加法
4DateTime tomorrow = now.AddDays(1);
5DateTime nextHour = now.AddHours(1);
6DateTime nextMinute = now.AddMinutes(1);
7
8// 减法
9DateTime yesterday = now.AddDays(-1);
10DateTime lastWeek = now.AddDays(-7);
11
12// 时间跨度计算
13DateTime start = new DateTime(2023, 1, 1);
14DateTime end = new DateTime(2023, 12, 31);
15TimeSpan duration = end - start; // 364天
16
17// Ticks运算
18DateTime preciseTime = now.AddTicks(50000); // 增加5毫秒
19

比较操作

1DateTime dateA = new DateTime(2023, 6, 15);
2DateTime dateB = new DateTime(2023, 6, 20);
3
4// 比较方法
5int compareResult = DateTime.Compare(dateA, dateB); 
6// <0: dateA < dateB
7// =0: 相等
8// >0: dateA > dateB
9
10// 运算符重载
11bool isBefore = dateA < dateB; // true
12bool isAfter = dateA > dateB;  // false
13bool isSame = dateA == dateB;  // false
14
15// 范围检查
16bool isInRange = dateA >= start && dateA <= end;
17

DateTime 与相关类型对比

特性DateTimeDateTimeOffsetTimeOnlyDateOnlyNodaTime
时区支持强(偏移量)
日期部分需要计算需要计算
时间部分
精度100ns100ns100ns1ns
序列化有问题安全安全安全安全
范围0001-99990001-999900:00-24:000001-9999无限
.NET版本1.0+2.0+6.0+6.0+NuGet包

最佳实践总结

存储原则:

  • 始终以 UTC 时间存储
  • 仅在显示时转换为本地时间

序列化准则:

1// 使用ISO 8601格式
2DateTime.UtcNow.ToString("O"); // 2023-10-05T06:30:45.1234567Z
3

时区处理:

  • 使用 DateTimeOffset 替代 DateTime
  • 复杂时区需求使用 NodaTimeTimeZoneInfo

日期/时间分离:

1// .NET 6+ 推荐
2DateOnly birthday = new DateOnly(1990, 5, 15);
3TimeOnly meetingTime = new TimeOnly(14, 30);
4

性能敏感场景:

  • 避免重复调用 DateTime.Now/UtcNow
  • 预计算静态日期值
  • 高精度计时用 Stopwatch

资源和文档


C#.NET DateTime 最强入门到进阶:格式化、转换、UTC、时区全覆盖》 是转载文章,点击查看原文


相关推荐


HTTP与HTTPS深度解析:从明文传输到安全通信
叁佰万2025/11/17

接续上文:https://blog.csdn.net/m0_73589512/article/details/154828521?spm=1001.2014.3001.5501 个人主页:叁佰万-CSDN博客 主题专栏:网络通信_叁佰万的博客-CSDN博客 目录 HTTP与HTTPS深度解析:从明文传输到安全通信 一、HTTP:万维网的“基础通信语言” 1. 核心工作原理:请求-响应模式 2. 核心结构:请求与响应的“格式规范” HTTP请求结构 HTTP响应结构 3. 关键


Bash 的 tail 命令
hubenchang05152025/11/16

#Bash 的 tail 命令 tail [OPTION]... [FILE]... 功能 查看文件的末尾。 类型 可执行文件(/usr/bin/tail),属于 coreutils。 参数 OPTION 选项: -c, --bytes=[+]NUM - 查看文件末尾的 NUM 字节,如果使用正号,则表示查看第 NUM 字节之后的内容 -f, --follow[={name|descriptor}] - 跟随文件,当文件内容增加时打印追加的内容 -F - 等价于 --follow=name


Python 的内置函数 max
IMPYLH2025/11/15

Python 内建函数列表 > Python 的内置函数 max Python 的内置函数 max() 是一个用于返回可迭代对象中最大元素或多个参数中最大值的实用函数。它支持多种数据类型和灵活的调用方式,是 Python 编程中常用的工具之一。 基本用法 单个可迭代对象: numbers = [3, 1, 4, 1, 5, 9, 2] print(max(numbers)) # 输出:9 多个参数: print(max(3, 1, 4, 1, 5)) # 输出:5 关键参数


IM 收件箱机制(三)
锅拌饭2025/11/14

在IM中,有了长连接之后,如何完成服务端与客户端的数据同步也是很重要的一环。 通常会有两种方案,一个是服务端直接转发,一个是收件箱机制。我们以消息类型的数据为例。 服务端直接转发: 是服务端收到消息A,存储完成后,直接将消息A的具体内容通过长连接通道发送给客户端B。我们把这种方式叫做服务端直接转发。 收件箱: 服务端收到消息后,不直接转发该消息给客户端,而是将消息id、消息所在会话id推送给客户端的消息收件箱,客户端发现消息收件箱有数据后,择机通过长连接 or 短连接拉取消息具体内容。 服务端直


C#.NET WebAPI 返回类型深度解析:IActionResult 与 ActionResult<T> 的区别与应用
唐青枫2025/11/13

简介 核心概念对比 特性IActionResultActionResult<T>引入版本ASP.NET Core 1.0ASP.NET Core 2.1主要用途表示HTTP响应(状态码+内容)类型化HTTP响应返回值类型接口(多种实现)泛型类内容类型安全❌ 无编译时检查✅ 编译时类型检查OpenAPI/Swagger需手动添加 [ProducesResponseType]自动推断响应类型适用场景需要灵活返回多种响应的


Python 的内置函数 help
IMPYLH2025/11/11

Python 内建函数列表 > Python 的内置函数 help Python 的内置函数 help 详解 基本功能 help() 是 Python 的一个内置函数,主要用于查看对象、模块、函数、类等的帮助文档。这个功能对于了解 Python 的各种组件及其使用方法非常有用,特别是在开发过程中需要快速查看某个功能的用法时。 使用方法 直接调用 help() help() 启动交互式帮助系统,此时可以输入模块名、函数名等查看帮助信息,输入"quit"退出帮助系统。 查看特定对象的


Vue SSR 源码解析:ssrTransformSuspense 与 ssrProcessSuspense
excel2025/11/9

一、背景与概念说明 Vue 在服务端渲染(SSR)过程中,会对组件模板进行两阶段编译: 阶段一(Transform) :生成用于描述结构的中间表达(IR, Intermediate Representation)。 阶段二(Codegen) :将中间表达转换为最终的字符串拼接指令(例如 _push、_renderSlot)。 而 <Suspense> 组件是 Vue 3 的一个特殊机制,用于异步内容加载与占位渲染。 在 SSR 环境下,Vue 需要为 <Suspense> 生成可在服务端正确


C++中的多态:动态多态与静态多态详解
oioihoii2025/11/6

多态是面向对象编程的三大特性之一,C++提供了两种主要的多态形式:动态多态和静态多态。本文将详细解释它们的区别,并通过代码示例进行说明。 什么是多态? 多态(Polymorphism)指同一个接口可以表现出不同的行为。在C++中,这允许我们使用统一的接口来处理不同类型的对象。 动态多态(运行时多态) 动态多态在程序运行时确定调用哪个函数,主要通过虚函数和继承机制实现。 实现机制 使用虚函数(virtual function) 通过继承关系 运行时通过虚函数表(vtable)决定调用哪个函数


图的寻路算法详解:基于深度优先搜索(DFS)的实现
Seal^_^2025/11/2

图的寻路算法详解:基于深度优先搜索DFS的实现 一、寻路算法概述DFS寻路示例 二、算法核心思想数据结构设计 三、算法实现详解1. 核心数据结构2. 构造函数初始化3. DFS实现4. 路径查询方法 四、完整代码实现五、算法测试与应用测试代码输出结果 六、算法分析与优化时间复杂度分析空间复杂度优化方向 七、DFS寻路与BFS寻路对比八、实际应用场景九、总结 🌺The Begin🌺点点关注,收藏不迷路🌺


高并发压力测试:Llama-2-7b 在昇腾 NPU 的六大场景表现
2501_938774292025/10/30

以下是关于 Llama-2-7b 在昇腾 NPU 上进行高并发压力测试的六大场景表现分析,结合网络公开信息和技术逻辑整理而成: 场景一:文本生成吞吐量测试 在批量文本生成任务中(如问答、摘要),昇腾 NPU 通过异构计算架构优化模型并行度。实测数据显示,当并发请求数从 100 提升至 1000 时,吞吐量增长约 3.8 倍,但单请求响应时间增加 15%-20%,显存占用峰值达 80%。 关键指标: 吞吐量:1200 tokens/s(batch_size=32)延迟:50ms/toke

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0