C#日期和时间:DateTime转字符串全面指南
C#日期和时间:DateTime转字符串全面指南
在 C# 开发中,DateTime
类型的时间格式化是高频操作场景。无论是日志记录、数据持久化,还是接口数据交互,合理的时间字符串格式都能显著提升系统的可读性和兼容性。本文将通过 20 + 实战示例,全面解析DateTime
转换为字符串的核心方法与最佳实践。
一、基础转换方法:快速获取常用格式
1. 无参 ToString ():本地化默认格式
DateTime.Now.ToString(); // 2023-10-25 14:30:45(依赖系统区域设置)
该方法返回基于当前系统文化设置的默认格式,适用于快速调试,但不建议用于跨环境交互。
2. 系统时间相关方法
方法 | 示例输出 | 用途说明 |
---|---|---|
ToFileTime() | 133756416859912816 | 获取 Windows 文件时间(长整型) |
ToFileTimeUtc() | 133756704859912816 | UTC 格式的文件时间 |
ToLocalTime() | 2023-10-25 22:30:45 | 转换为本地时区时间 |
ToUniversalTime() | 2023-10-25 06:30:45 | 转换为 UTC 时间 |
3. 预定义格式方法
DateTime.Now.ToLongDateString(); // "2023年10月25日"(中文环境)
DateTime.Now.ToShortDateString(); // "2023-10-25"
DateTime.Now.ToLongTimeString(); // "14:30:45"
DateTime.Now.ToShortTimeString(); // "14:30"
这些方法提供了日期和时间的粗细粒度划分,适用于需要快速生成特定格式的场景。
二、自定义格式字符串:精准控制输出
1. 标准格式说明符(单个字符)
通过ToString(string format)
或string.Format
使用格式字符:
格式符 | 示例(2023-10-25 14:30:45) | 说明 |
---|---|---|
d | 2023-10-25 | 短日期格式 |
D | 2023 年 10 月 25 日 | 长日期格式 |
t | 14:30 | 短时间格式 |
T | 14:30:45 | 长时间格式 |
f | 2023 年 10 月 25 日 14:30 | 完整日期 + 短时间 |
F | 2023 年 10 月 25 日 14:30:45 | 完整日期 + 长时间 |
s | 2023-10-25T14:30:45 | ISO 8601 排序日期格式 |
u | 2023-10-25 14:30:45Z | UTC 通用排序格式 |
r | Wed, 25 Oct 2023 14:30:45 GMT | RFC 1123 标准格式 |
示例代码:
DateTime.Now.ToString("s"); // "2023-10-25T14:30:45"(适合API返回)
string.Format("{0:u}", DateTime.Now); // "2023-10-25 14:30:45Z"(UTC标准化)
2. 自定义格式符(组合字符)
通过组合yyyy/MM/dd HH:mm:ss
等字符实现任意格式:
字符 | 说明 | 示例(2023-10-25 14:30:45) |
---|---|---|
yyyy | 四位数年份 | 2023 |
MM | 两位数月份(01-12) | 10 |
dd | 两位数日期 | 25 |
HH | 24 小时制小时(00-23) | 14 |
mm | 分钟(00-59) | 30 |
ss | 秒(00-59) | 45 |
fff | 毫秒(000-999) | 450 |
复杂示例:
// 生成带毫秒的日志时间戳
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); // "2023-10-25 14:30:45.450"// 生成Excel兼容的日期时间
DateTime.Now.ToString("yyyy/mm/dd hh:mm:ss tt"); // "2023/10/25 02:30:45 下午"(带AM/PM标识)
三、高级时间操作与格式处理
1. 时间偏移与计算
通过Add
系列方法实现时间加减后格式化:
// 增加1.5天(36小时)
DateTime.Now.AddDays(1.5).ToString("yyyy-MM-dd HH:mm"); // "2023-10-27 02:30"// 增加10000 ticks(1毫秒=10000 ticks)
DateTime.Now.AddTicks(10000).ToString("yyyy-MM-dd HH:mm:ss.fff"); // 精确到毫秒级增量
2. 多文化格式支持
通过CultureInfo
指定非默认文化格式:
using System.Globalization;// 生成法语格式日期
DateTime.Now.ToString("D", CultureInfo.CreateSpecificCulture("fr-FR")); // "25 octobre 2023"// 生成日本格式时间
DateTime.Now.ToString("t", CultureInfo.GetCultureInfo("ja-JP")); // "14:30"
3. 特殊格式处理
需求场景 | 实现代码 | 输出示例 |
---|---|---|
生成 ISO 8601 完整格式 | DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ") | “2023-10-25T06:30:45+08:00” |
去除时间部分 | DateTime.Now.Date.ToString("yyyy-MM-dd") | “2023-10-25” |
生成时间戳(秒级) | ((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds().ToString() | “1698220245” |
生成时间戳(毫秒级) | ((DateTimeOffset)DateTime.Now).ToUnixTimeMilliseconds().ToString() | “1698220245450” |
四、常见问题与最佳实践
1. 时区转换陷阱
- UTC 与本地时间:始终明确时间的时区属性,避免混合使用
ToLocalTime()
和ToUniversalTime()
- 跨平台兼容性:优先使用
ISO 8601
格式(如s
/u
/r
),避免依赖系统区域设置
2. 性能优化
- 高频转换场景使用
StringBuilder
而非字符串拼接 - 预定义格式字符串可缓存重用,避免重复解析
3. 空值处理
DateTime? nullableDate = null;
string result = nullableDate?.ToString("yyyy-MM-dd") ?? "未指定时间"; // 安全转换
4. 单元测试建议
对关键格式进行断言测试:
var date = new DateTime(2023, 10, 25, 14, 30, 45);
Assert.AreEqual("2023-10-25", date.ToString("d"));
Assert.AreEqual("25 octobre 2023", date.ToString("D", CultureInfo.French));
五、总结:选择合适的格式化方案
场景分类 | 推荐方法 | 示例代码 | 优势特点 |
---|---|---|---|
快速调试 | ToString() | DateTime.Now.ToString() | 无需参数,快速查看 |
标准化输出 | 标准格式符(如 “s”/“u”) | date.ToString("s") | 跨平台兼容 |
自定义格式 | 自定义格式字符串 | date.ToString("yyyy/MM/dd HH:mm") | 灵活控制输出样式 |
跨文化支持 | 带CultureInfo 的 ToString | date.ToString("D", fr-FR) | 多语言环境适配 |
时间戳生成 | ToUnixTimeSeconds /ToFileTime | ((DateTimeOffset)date).ToUnixTimeSeconds() | 数值化时间表示 |
掌握DateTime
的格式化技巧,能有效提升系统在数据交互、日志记录、报表生成等场景的健壮性。建议在实际开发中根据具体需求(如目标系统格式要求、性能敏感度、文化兼容性)选择最合适的转换方案,并通过单元测试确保格式的一致性。
相关文章:
C#日期和时间:DateTime转字符串全面指南
C#日期和时间:DateTime转字符串全面指南 在 C# 开发中,DateTime类型的时间格式化是高频操作场景。无论是日志记录、数据持久化,还是接口数据交互,合理的时间字符串格式都能显著提升系统的可读性和兼容性。本文将通过 20 实战示例…...

手机收不到WiFi,手动输入WiFi名称进行连接不不行,可能是WiFi频道设置不对
以下是电脑上分享WiFi后,部分手机可以看到并且能连接,部分手机不行,原因是:频道设置为5GHz,修改成,任何可用频率,则可...

批量文件重命名工具
分享一个自己使用 python 开发的小软件,批量文件重命名工具,主要功能有批量中文转拼音,简繁体转换,大小写转换,替换文件名,删除指定字符,批量添加编号,添加前缀/后缀。同时还有文件时…...

ATPrompt方法:属性嵌入的文本提示学习
ATPrompt方法:属性嵌入的文本提示学习 让视觉-语言模型更好地对齐图像和文本(包括未知类别)。 一、问题场景:传统方法的局限 假设你有一个模型,能识别图像中的物体并关联到文本标签(如“狗”“猫”)。 传统方法: 用“软提示”(可学习的文本标签)和“硬类别标记”…...

14.「实用」扣子(coze)教程 | Excel文档自动批量AI文档生成实战,中级开篇
随着AI编程工具及其能力的不断发展,编程将变得越来越简单。 在这个大趋势下,大师兄判断未来的编程将真正成为像office工具一样的办公必备技能。每个人通过 (专业知识/资源编程)将自己变成一个复合型的人才,大大提高生…...

对于geoserver发布数据后的开发应用
对于geoserver发布数据后的开发应用 文章目录 对于geoserver发布数据后的开发应用[TOC](文章目录) 前言一、geosever管理地理数据的后端实用方法后端进行登录geoserver并且发布一个矢量数据前置的domain数据准备后端内容 总结 前言 首先,本篇文章仅进行技术分享&am…...
液体散货装卸管理人员备考指南
备考液体散货类装卸管理人员资格考试,需要系统学习理论知识、熟悉实操流程,并掌握相关法规标准。以下是备考建议,分为四个阶段: 一、明确考试内容与要求 考试范围 理论知识:液体散货(石油、化学品、液化…...

基于Qlearning强化学习的二阶弹簧动力学模型PID控制matlab性能仿真
目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 传统PID控制器 2.2 Q-Learning强化学习原理 2.3 Q-Learning与PID控制器的融合架构 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2024B仿真结果如下(完整代码运行后无水印)&a…...
【监控】Spring Boot 应用监控
这段配置是 Spring Boot 应用中对 Actuator 和 Micrometer 监控系统的配置,用于将应用的指标暴露给 Prometheus 进行收集。下面我将详细介绍这种配置方式及其提供的指标。 配置说明 这个配置主要涉及 Spring Boot Actuator 和 Micrometer 两个核心组件:…...
「MATLAB」计算校验和 Checksum
什么是校验和 是一个算法,将一串数据累加,得到一个和。 MATLAB程序 function c_use Checksum(packet) %Checksum 求校验和 % 此处checksum提供详细说明checksum 0;for i 1:length(packet)value hex2dec(packet(i));checksum checksum value; …...

【AS32X601驱动系列教程】SMU_系统时钟详解
在现代嵌入式系统中,时钟与复位管理是确保系统稳定运行的关键。我们的SMU(系统管理单元)模块专注于此核心任务,通过精准的时钟配置和复位控制,为整个系统提供可靠的时序保障。 SMU模块的主要功能是完成时钟和复位的管…...

09 接口自动化-用例管理框架pytest之allure报告定制以及数据驱动
文章目录 一、企业级的Allure报告的定制左边的定制:右边的定制:1.用例的严重程度/优先级2.用例描述3.测试用例连接的定制4.测试用例步骤的定制5.附件的定制 二、企业中真实的定制有哪些?三、allure报告如何在本地访问四、allure中的数据驱动装…...

React笔记-Ant Design X样本间对接智谱AI
目标 后端对接是智谱AI。 过程 先把Ant Design X样本间搭建好,通过此篇博文获得智谱AI的URL等 智谱AI开放平台 看下此篇博文的“使用API接入” 通义千问 - Ant Design X 将样本间代码的: const [agent] useXAgent({request: async ({ message }, { …...

网络安全-等级保护(等保) 3-2 GB/T 28449-2019《信息安全技术 网络安全等级保护测评过程指南》-2018-12-28发布【现行】
################################################################################ GB/T 28448-2019 《信息安全技术 网络安全等级保护测评要求》规定了1~4及的测评要求以及对应级别云大物移工的测评扩展要求,与GB/T 22239-2019 《信息安全技术 网络安全等级保护…...

【Bug】--node命令加载失败
环境:本地已经安装好了nodejs,并且已经加入了环境变量path 报错: (解释器) PS D:\桌面文件\pythonProject\vue-fastapi-admin\web> npm i -g pnpm npm : 无法加载文件 D:\桌面文件\node-v22.14.0-win-x64\node-v22.14.0-win-x64\npm.p…...

Java 大视界 -- 基于 Java 的大数据分布式存储在视频会议系统海量视频数据存储与回放中的应用(263)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

ROS云课三分钟-3D性能测试supertuxkart和游戏推荐等-国际象棋
ROS云课三分钟-破壁篇GCompris-一小部分支持Edu应用列表-2025-CSDN博客 很多时候,有一种思维定势,将人锁住,人口就是囚。 口人囚~口加人等于囚-CSDN博客 如果突破,跳出问题,再看问题。 这门课程,或者这个平…...

汽车零部件行业PLM案例:得瑞客汽车(Dereik) 部署国产PLM
2024年,昆山得瑞客汽车零部件有限公司(以下简称“得瑞客汽车”)签约智橙云PLM(智橙PLM),近日,双方启动了PLM项目评估会,商讨在汽车零部件行业研发数字化转型领域进行更深层的合作。 …...

Web攻防-SQL注入数据格式参数类型JSONXML编码加密符号闭合
知识点: 1、Web攻防-SQL注入-参数类型&参数格式 2、Web攻防-SQL注入-XML&JSON&BASE64等 3、Web攻防-SQL注入-数字字符搜索等符号绕过 案例说明: 在应用中,存在参数值为数字,字符时,符号的介入,…...
浅谈测试驱动开发TDD
目录 1.什么是TDD 2.TDD步骤 3.TDD 的核心原则 4.TDD 与传统开发的对比 5.TDD中的单元测试和集成测试区别 6.总结 1.什么是TDD 测试驱动开发(Test-Driven Development,简称 TDD) 是一种软件开发方法论,核心思想是 “先写测试…...
深入解析 Flink 中的时间与窗口机制
一、时间类型详解 1. 处理时间 处理时间(Processing Time)是指执行操作算子的本地系统时间,它是 Flink 中最简单、性能最高的时间概念。在处理时间语义下,Flink 直接使用机器的本地时钟来确定时间,无需额外的时间提取与处理逻辑。 以电商订单处理为例,当订单支付成功…...

医疗AI项目文档编写核心要素硬核解析:从技术落地到合规实践
一、引言:医疗AI项目文档的核心价值 1.1 行业演进与文档范式变革 全球医疗AI产业正经历从技术验证(2021-2025)向临床落地(2026-2030)的关键转型期。但是目前医疗AI正在逐步陷入"技术繁荣-应用滞后"的悖论&…...

voc怎么转yolo,如何分割数据集为验证集,怎样检测CUDA可用性 并使用yolov8训练安全帽数据集且构建基于yolov8深度学习的安全帽检测系统
voc怎么转yolo,如何分割数据集为验证集,怎样检测CUDA可用性 安全帽数据集,5000张图片和对应的xml标签, 五千个yolo标签,到手即可训练。另外附四个常用小脚本,非常实用voc转yolo代码.py 分割数据集为验证集…...

vllm server返回404的一种可能得解决方案
我的 server 启动指令 CUDA_VISIBLE_DEVICES0,1,2,3,4,5,6,7 PYTHONPATH${PYTHONPATH}:/root/experiments/vllm vllm serve ./models/DeepSeek-V3-awq --tensor-parallel-size 8 --trust-remote-code --disable-log-requests --load-format dummy --port 8040 client 端访访…...

kafka之操作示例
一、常用shell命令 #1、创建topic bin/kafka-topics.sh --create --zookeeper localhost:2181 --replications 1 --topic test#2、查看创建的topic bin/kafka-topics.sh --list --zookeeper localhost:2181#3、生产者发布消息命令 (执行完此命令后在控制台输入要发…...
MySQL问题:MySQL中使用索引一定有效吗?如何排查索引效果
不一定有效,当查询条件中不包含索引列或查询条件复杂且不匹配索引顺序 对于一些小表,MySQL可能选择全表扫描而非使用索引,因为全表扫描的开销可能更小 最终是否用上索引是根据MySQL成本计算决定的,评估CPU和I/O成本 排查索引效…...
OpenSSL 签名验证详解:PKCS7* p7、cafile 与 RSA 验签实现
OpenSSL 签名验证详解:PKCS7* p7、cafile 与 RSA 验签实现 摘要 本文深入剖析 OpenSSL 中 PKCS7* p7 数据结构和 cafile 的作用及相互关系,详细讲解基于 OpenSSL 的 RSA 验签字符串的 C 语言实现,涵盖签名解析、证书加载、验证流程及关键要…...
利用 `ngx_http_xslt_module` 实现 NGINX 的 XML → HTML 转换
一、模块简介 模块名称:ngx_http_xslt_module 首次引入版本:0.7.8 功能:在回传给客户端之前,用指定的 XSLT 样式表对 XML 响应进行转换。 依赖: libxml2libxslt 编译选项:需在 NGINX 编译时添加 --with…...
C语言队列详解
一、什么是队列? 队列(Queue)是一种先进先出(FIFO, First In First Out)的线性数据结构。它只允许在一端插入数据(队尾),在另一端删除数据(队头)。常见于排队…...
Qt中的智能指针
Qt中的智能指针 Qt中提供了多种智能指针,用于管理自动分配的内存,避免内存泄漏和悬挂指针的问题。以下是Qt中常见的智能指针及其功能和使用场景: 1. QSharedPointer QSharedPointer 是 Qt 框架中用于管理动态分配对象的智能指针,类似于 C1…...