C# DateTime.Now 格式化与日期计算实战指南

码头散步
码头散步
发布时间:2026-10-14| 5人浏览过
原创

在 C# 开发中,获取当前时间及进行灵活的时间区间计算是日常高频需求。本文将详细介绍 System.DateTime.Now 属性的使用,通过标准格式符和自定义参数实现精确的时间展示,并利用日期加减运算解决“本周”、“本月”、“上季度”等常见时间范围判断问题。

DateTime.Now 的核心概念

System.DateTime.Now 是 .NET 框架中用于获取当前系统日期和时间的静态属性。它返回一个 DateTime 结构体实例,该实例包含年、月、日、时、分、秒及毫秒信息。在处理时间数据时,通常需要进行两类操作:一是将时间转换为特定格式的字符串(格式化),二是基于当前时间推算其他时间点(计算)。下面将分别对这两类操作进行详解。

时间字符串格式化

C# 提供了丰富的内置格式字符串,同时也允许用户定义自定义输出模板。以下代码展示了常用标准化格式及自定义格式的效果:

// 2008年4月24日
System.DateTime.Now.ToString("D"); 
// 2008-4-24
System.DateTime.Now.ToString("d"); 
// 2008年4月24日 16:30:15
System.DateTime.Now.ToString("F"); 
// 2008年4月24日 16:30
System.DateTime.Now.ToString("f"); 
// 2008-4-24 16:30:15
System.DateTime.Now.ToString("G"); 
// 2008-4-24 16:30
System.DateTime.Now.ToString("g"); 
// 16:30:15
System.DateTime.Now.ToString("T"); 
// 16:30
System.DateTime.Now.ToString("t"); 
// 2008年4月24日 8:30:15 (UTC时间)
System.DateTime.Now.ToString("U"); 
// 2008-04-24 16:30:15Z (ISO 8601 格式)
System.DateTime.Now.ToString("u"); 
// 4月24日
System.DateTime.Now.ToString("m"); 
// 4月24日
System.DateTime.Now.ToString("M"); 
// Tue, 24 Apr 2008 16:30:15 GMT
System.DateTime.Now.ToString("r"); 
// 同 "R"
System.DateTime.Now.ToString("R"); 
// 2008年4月
System.DateTime.Now.ToString("y"); 
// 2008年4月
System.DateTime.Now.ToString("Y"); 
// 2008-04-24T15:52:19.1562500+08:00 (完整 ISO 8601)
System.DateTime.Now.ToString("o"); 
System.DateTime.Now.ToString("O"); 
// 2008-04-24T16:30:15
System.DateTime.Now.ToString("s"); 

第1步:使用自定义模板

当内置格式不满足需求时,可以使用占位符拼接自定义字符串。常用的占位符包括 yyyy(四位年份)、M或MM(月份)、d或dd(日期)以及 H/m/s(时分秒)。

// 2008-04-24 16:30:15.1234
System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff"); 
// 2008年04月24日 16时30分48秒
System.DateTime.Now.ToString("yyyy年MM月dd HH时mm分ss秒"); 
// 星期二, 四月 24 2008
System.DateTime.Now.ToString("dddd, MMMM dd yyyy"); 
// 二, 四月 24 '08
System.DateTime.Now.ToString("ddd, MMM d \"'\"yy"); 
// 星期二, 四月 24
System.DateTime.Now.ToString("dddd, MMMM dd"); 
// 4-08
System.DateTime.Now.ToString("M/yy"); 
// 24-04-08
System.DateTime.Now.ToString("dd-MM-yy"); 

第2步:数值型数据格式化

ToString() 不仅适用于时间,也常用于数字类型的格式化输出:

// 字符型转换转为字符串示例 (假设值为 12345)
double value = 12345.0;
value.ToString("n"); // 生成 "12,345.00"
value.ToString("C"); // 生成 "¥12,345.00" (货币)
value.ToString("e"); // 生成 "1.234500e+004" (科学计数法)
value.ToString("f4"); // 生成 "12345.0000" (固定小数点)
int hexValue = 12345;
hexValue.ToString("x"); // 生成 "3039" (16进制)
value.ToString("p"); // 生成 "1,234,500%" (百分比,视数值而定) 

日期与时间差值计算

在实际业务中,我们经常需要计算“昨天的日期”或“下周的具体时间”。这可以通过 AddDays、AddMonths、AddYears 等方法实现。这些方法不会修改原 DateTime 对象,而是返回一个新的对象。

第1步:天级别的时间偏移

利用整数参数的正负值来向前或向后推移天数。

// 今天
DateTime.Now.Date.ToShortDateString();
// 昨天,就是今天的日期减一
DateTime.Now.AddDays(-1).ToShortDateString();
// 明天,同理,加一
DateTime.Now.AddDays(1).ToShortDateString();
// 7天后
DateTime.Now.AddDays(7).ToShortDateString();
// 7天前
DateTime.Now.AddDays(-7).ToShortDateString(); 

第2步:周级别的计算

计算周的边界需要获取当前星期的索引。在 C# 中,DayOfWeek 枚举返回值从 Sunday=0 到 Saturday=6。因此,周一实际上对应索引 1。要获取本周起始日(周日),需减去当前的星期索引值;获取本周结束日(周六),则减去索引值后再加 6 天。

// 注意:C# 默认一周从周日开始(0)

以下为获取本周(周日始,周六止)的代码:

// 本周第一天(周日)
DateTime.Now.AddDays(Convert.ToDouble((0 - Convert.ToInt16(DateTime.Now.DayOfWeek)))).ToShortDateString();
// 本周最后一天(周六)
DateTime.Now.AddDays(Convert.ToDouble((6 - Convert.ToInt16(DateTime.Now.DayOfWeek)))).ToShortDateString(); 

星期显示技巧:为了避免硬编码判断,可以将星期映射为数组:

string[] DaysOfweek = new string[]{ "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
string currentWeekName = DaysOfweek[Convert.ToInt16(DateTime.Now.DayOfWeek)]; 

上周和下周的逻辑类似,即在当前周的上下基础上整体加减 7 天:

// 上周
DateTime.Now.AddDays(Convert.ToDouble((0 - Convert.ToInt16(DateTime.Now.DayOfWeek))) - 7).ToShortDateString();
DateTime.Now.AddDays(Convert.ToDouble((6 - Convert.ToInt16(DateTime.Now.DayOfWeek))) - 7).ToShortDateString();
// 下周
DateTime.Now.AddDays(Convert.ToDouble((0 - Convert.ToInt16(DateTime.Now.DayOfWeek))) + 7).ToShortDateString();
DateTime.Now.AddDays(Convert.ToDouble((6 - Convert.ToInt16(DateTime.Now.DayOfWeek))) + 7).ToShortDateString(); 

第3步:月级别的计算

计算月初和月末有多种方式。一种直观的方法是利用 Parse 构造特定月份的第一天,再结合 AddMonths 跳转到下个月初并退一天(即当前月末)。

// 本月第一天 (简易写法)
DateTime.Now.ToString("yyyy-MM-01");
// 或者
DateTime.Parse(DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + "1").ToShortDateString();

// 本月最后一天
// 先算出下个月1号,再加1天往前推,即为上月末日
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).AddDays(-1).ToShortDateString(); 

上月和下月的逻辑同样简单:

// 上个月第一天
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(-1).ToShortDateString();
// 上个月最后一天
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();

// 下个月第一天
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).ToShortDateString();
// 下个月最后一天
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(2).AddDays(-1).ToShortDateString(); 

第4步:季度与年度的计算

年度计算较为直接,只需锁定1月1日并进行年份偏移:

// 本年度第一天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).ToShortDateString();
// 本年度最后一天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).AddDays(-1).ToShortDateString();

// 上年度第一天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(-1).ToShortDateString();
// 上年度最后一天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddDays(-1).ToShortDateString();

// 下年度第一天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).ToShortDateString();
// 下年度最后一天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(2).AddDays(-1).ToShortDateString(); 

季度的计算稍微复杂一些,核心在于推算本季度第一个月的第一天。一年有四个季度,每个季度三个月。公式 (Month - 1) % 3 可以得出当前月份在当前季度内的偏移量。用总偏移减去这个余数,即得到本季度首月的累积月份数。

// 修正公式:原始草稿中的 % 22 疑似笔误,标准的季度算法通常为模 3。这里采用更清晰的逻辑描述。
// 假设当前是 4月 (Q2),(4-1)%3 = 0,代表处于季度第一月。如果是 5月,(5-1)%3 = 1,需减去1个月回到首月。

// 本季度第一天 (通用逻辑伪代码说明,实际代码建议参照下方简便写法)
// 关键思路:将月份推到本季度的第一月 (1, 4, 7, 10月)
int monthOffset = (DateTime.Now.Month - 1) % 3; 
string firstOfMonth = DateTime.Now.AddMonths(0 - monthOffset).ToString("yyyy-MM-01");

// 本季度最后一天
// 下季度第一天(即本季度最后一个月+1个月)的1号,减1天即为本季度最后一天
// 这里使用 Parse 配合 AddMonths 跳转更稳妥
DateTime.Parse(firstOfMonth).AddMonths(3).AddDays(-1).ToShortDateString();

// 下季度第一天
DateTime.Parse(firstOfMonth).AddMonths(3).ToShortDateString();

// 上季度
DateTime.Parse(firstOfMonth).AddMonths(-3).ToShortDateString();
DateTime.Parse(firstOfMonth).AddMonths(-3).AddMonths(3).AddDays(-1).ToShortDateString(); // 简化为 firstOfMonth 减一天? 不对,应为上季度末。
// 简便写法:上季度第一天 = 本季度第一天 减去 3个月

对于复杂的季度运算,如果使用上述基于 AddMonths 的逻辑更为稳健,避免了奇奇怪怪的取模运算带来的歧义。

总结与注意事项

  • 不可变性:DateTime 是不可变类型,所有 Add... 方法都返回新实例,请确保接收返回值。
  • 时区问题:DateTime.Now 返回的是本地系统时间。如果需要处理跨时区数据,建议使用 DateTime.UtcNow 或在传输时保留 UTC 标识。
  • 性能考量:在循环中进行大量的 Parse 和 ToString 转换可能会影响性能,必要时可复用缓存的日期格式对象或仅做数学运算。
以上就是 C# 中 DateTime.Now 函数的详细内容,更多关于 C# 日期处理和格式化操作的资料请关注本站其它相关文章!
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。