C# DateTime.ToString 按语言生成对应时间格式

Jasper
Jasper
发布时间:2026-10-13 | 4人浏览过
原创

在C#开发中,处理多语言需求时如何根据用户区域自动转换时间与货币的显示格式?本文将详细介绍如何利用 DateTime.ToString 的重载方法与 CultureInfo 类,实现基于线程区域的自动化格式转换。

核心方法与准备工作

要实现国际化的日期输出,关键在于使用 DateTime.ToString(string format, IFormatProvider provider) 方法。其中 format 代表标准日期字符串(如 d, D, F),而 provider 通常传入 CultureInfo 对象。为了保持整个应用的统一性,推荐在程序入口或初始化阶段设定当前的线程文化。

第一步:切换当前线程的区域性

通过修改 Thread.CurrentThread.CurrentCulture,可以指定系统后续所有未指明提供者的格式化操作都应遵循的目标语言环境。

using System;
using System.Globalization;
using System.Threading;

// 模拟切换至中文环境
Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CN");

// 准备测试时间
DateTime dt = Convert.ToDateTime("2013-12-02 20:20:22");
Console.WriteLine($"当前语言:{Thread.CurrentThread.CurrentCulture.DisplayName}");
Console.WriteLine($"原始日期:{dt}");

第二步:调用 ToString 进行格式转换

将指定的 CultureInfo 作为第二个参数传递给 ToString,框架会自动根据该区域的习惯替换分隔符、星期名称及AM/PM表示等。

// d - 短日期模式(如:2013/12/2)
Console.WriteLine($"d-短日期: {dt.ToString("d", Thread.CurrentThread.CurrentCulture)}");

// D - 长日期模式(如:2013年12月2日 星期一)
Console.WriteLine($"D-长日期: {dt.ToString("D", Thread.CurrentThread.CurrentCulture)}");

// f - 完整日期/短时间(如:2013年12月2日 星期一 20:20)
Console.WriteLine($"f-完整日期/: {dt.ToString("f", Thread.CurrentThread.CurrentCulture)}");

// F - 完整日期/长时间(如:2013年12月2日 星期一 20:20:22)
Console.WriteLine($"F-完整日期/: {dt.ToString("F", Thread.CurrentThread.CurrentCulture)}");

// g/G - 常规日期/短时间或长时间 
Console.WriteLine($"g-常规短: {dt.ToString("g", Thread.CurrentThread.CurrentCulture)}");
Console.WriteLine($"G-常规长: {dt.ToString("G", Thread.CurrentThread.CurrentCulture)}");

// m/M - 月日模式(如:12月2日)
Console.WriteLine($"m-M月日: {dt.ToString("m", Thread.CurrentThread.CurrentCulture)}");
Console.WriteLine($"M-大月日: {dt.ToString("M", Thread.CurrentThread.CurrentCulture)}");

// o/R/s/u/U - 序列化或排序相关格式(通常ISO 8601风格)
Console.WriteLine($"o-往返: {dt.ToString("o", Thread.CurrentThread.CurrentCulture)}");
Console.WriteLine($"R-RFC1123: {dt.ToString("R", Thread.CurrentThread.CurrentCulture)}");
Console.WriteLine($"s-可排序: {dt.ToString("s", Thread.CurrentThread.CurrentCulture)}");
Console.WriteLine($"u-通用可排序(带T): {dt.ToString("u", Thread.CurrentThread.CurrentCulture)}");
Console.WriteLine($"U-通用长: {dt.ToString("U", Thread.CurrentThread.CurrentCulture)}");

// t/T - 短时间/长时间(如:20:20 / 20:20:22)
Console.WriteLine($"t-短时: {dt.ToString("t", Thread.CurrentThread.CurrentCulture)}");
Console.WriteLine($"T-长时: {dt.ToString("T", Thread.CurrentThread.CurrentCulture)}");

// Y/y - 年月模式(如:2013年12月)
Console.WriteLine($"Y-年月: {dt.ToString("Y", Thread.CurrentThread.CurrentCulture)}");

// 注意:自定义格式不包含任何区域性信息
Console.WriteLine($"自定义无参: {dt.ToString("yyyyMMdd")}");
Console.ReadLine();

运行后生成的不同语言效果对比截图如下:

从执行结果可以看出,使用了区域性提供者的标准格式占位符(字母形式)能够完美跟随环境变化。相反,若直接传递类似 "yyyy-MM-dd" 这种硬编码的自定义字符串,则会忽略区域设定,导致显示不合规。

附录:获取其他格式(如货币)

CultureInfo 同样用于控制数字和货币表现。例如格式化金额,需获取其 NumberFormat 属性:

decimal amount = 123659.256m;
// c 为货币格式,配合当前文化的 NumberFormat 输出
string currencyStr = amount.ToString("c", Thread.CurrentThread.CurrentCulture.NumberFormat);

CultureInfo 类关键说明

CultureInfo 保存了特定区域性的语言、国家、日历系统及约定规则。它继承自 IFormatProvider,是 .NET 国际化基石。区域性命名遵循 RFC 1766 标准,格式为 <lang>-<region>(如 en-US, de-DE)。当双字母代码不可用(如某些小语种)时,会采用三字母 ISO 639-2 代码,或通过书写符号后缀(如 -Cyrl, -Latn)加以区分。预定义的名称涵盖全球各类常见开发场景。

以上就是C# DateTime.ToString根据不同语言生成相应的时间格式的详细内容,更多关于C#时间格式化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表