0

0

C#怎么计算两个日期的差值_C#如何使用TimeSpan计算天数【指南】

冰火之心

冰火之心

发布时间:2026-03-17 13:01:03

|

270人浏览过

|

来源于php中文网

原创

直接用 DateTime 相减得 TimeSpan 是最可靠方式,避免手动计算闰年、时区等问题;需确保 Kind 一致(推荐全转 Utc),并注意 TimeSpan.Days 与 TotalDays 的本质区别。

c#怎么计算两个日期的差值_c#如何使用timespan计算天数【指南】

DateTime.Subtract() 得到 TimeSpan 是最直接的方式

别绕弯子——两个 DateTime 相减,C# 会自动返回 TimeSpan,这是设计好的行为,不是“技巧”。TimeSpan 本身不表示“从哪到哪”,只表示一段持续时间,所以它天然适合算差值。

常见错误是手动拆解年月日去计算天数,结果漏掉闰年、时区、夏令时,甚至 DateTime.Kind 不一致导致意外偏移。直接相减能避开所有这些。

  • DateTime 必须是同一种 KindUnspecifiedLocalUtc),否则减法虽能运行,但语义模糊;推荐统一转成 Utc 再算
  • 如果其中一个值是 null(比如来自数据库的可空字段),要先判空,否则抛 NullReferenceException
  • TimeSpan.TotalDays 返回 double,含小数;要整数天数就用 TimeSpan.Days(只取整数部分,截断不四舍五入)
DateTime start = new(2023, 1, 15, 14, 30, 0, DateTimeKind.Utc);
DateTime end = new(2023, 2, 20, 9, 15, 0, DateTimeKind.Utc);
TimeSpan diff = end.Subtract(start); // 或直接写 end - start
Console.WriteLine(diff.TotalDays); // 35.822916666666664
Console.WriteLine(diff.Days);      // 35(只取整天数)

TimeSpan.DaysTimeSpan.TotalDays 差在哪

这是最容易混淆的点:两者都“算天数”,但含义完全不同。

  • TimeSpan.DaysTimeSpan 的“日字段”值,范围是 -24 到 +24,只反映超出小时的部分(比如 36 小时 → Days = 1Hours = 12
  • TimeSpan.TotalDays 才是你真正想要的“总天数”,是把整个时间跨度换算成天的小数值(36 小时 = 1.5 天)
  • 如果跨度超过 24 天,Days 会“归零重算”,完全不可靠;必须用 TotalDaysMath.Floor(ts.TotalDays) 获取完整天数

跨时区计算前必须先统一 DateTimeKind

用户常以为 DateTime 存的是“绝对时间”,其实不是——它的 Kind 属性决定解释方式。本地时间减 UTC 时间,差值可能多出或少掉 8 小时,且随夏令时浮动。

Spell.tools
Spell.tools

高颜值AI内容营销创作工具

下载
  • DateTime.SpecifyKind(dt, DateTimeKind.Utc) 强制指定类型,仅当原始值确实代表该时区时间时才安全
  • 更稳妥的做法是:用 dt.ToUniversalTime() 转换(注意:对 Unspecified 值,.NET 默认按本地时区处理,可能出错)
  • 如果数据来自 API 或数据库,优先存 UTC,读取后直接用,避免反复转换
// 错误示范:混合 Kind
DateTime local = DateTime.Now;                    // Local
DateTime utc = DateTime.UtcNow;                   // Utc
TimeSpan bad = utc - local; // 结果取决于本地时区偏移,不稳定
<p>// 正确做法:全转 UTC
TimeSpan good = utc - local.ToUniversalTime();

需要精确到“自然日”(如日历上数格子)就得用 Calendar

前面所有方法算的都是“连续 24 小时为一天”的物理天数。但如果你要的是“从 3 月 31 日到 4 月 2 日是 3 天”,即日历上的日期计数,TimeSpan 就不够用了——它不管月份长度、闰年、起止时间点。

  • TimeSpan 对 3 月 31 日 23:59 到 4 月 1 日 00:01,只算 0.001 天;但人眼日历是跨了两天
  • 这时得用 Calendar.GetYear()/GetMonth()/GetDayOfMonth() 手动比对,或借助 NodaTime 库的 Period.Between()
  • .NET 原生没提供“日历天数”API,硬写容易漏边界(比如跨年、跨月),建议明确需求再决定是否引入第三方

实际项目里,80% 的“天数差”需求其实只要 (end - start).TotalDays 就够了。真要日历逻辑,先确认业务方说的“差几天”到底指什么——是倒计时?工单处理时长?还是排班表跨度?不同场景,解法差很远。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

255

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1153

2024.03.01

java中calendar类的用法
java中calendar类的用法

Java Video类是JavaFX库中的一个类,用于创建和操作视频对象。它提供了方法来加载、播放、暂停、停止和控制视频的音量、速度和循环等属性。想了解更多Java中类的相关内容,可以阅读本专题下面的文章。

326

2024.02.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

355

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

108

2025.10.23

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

391

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2113

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

359

2023.08.31

c++ 字符处理
c++ 字符处理

本专题整合了c++字符处理教程、字符串处理函数相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.5万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号