You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过GetDateTimeFormats()获取特定日期时间格式?

解决C#中GetDateTimeFormats()获取特定格式的痛点

我完全懂你遇到的麻烦——GetDateTimeFormats()确实会吐出一大堆日期时间格式,但连个对应名称都没有,靠索引取又怕换个区域性设置就跑偏了,尤其是你要的那种标准ISO 8601格式(也就是你说的YYYY-MM-DDThh:mm:ss.sssZ,不过正确的格式字符串应该是yyyy-MM-ddTHH:mm:ss.fffZ,小写y代表年份,大写H是24小时制,fff对应毫秒,Z标识UTC时区)。

下面给你两种可行的解决思路,优先推荐第一种,稳定又靠谱:

1. 直接用自定义格式字符串(推荐)

其实根本不用纠结GetDateTimeFormats(),C#的DateTime.ToString()方法支持直接传入自定义格式字符串,完全不受区域性影响,这才是获取特定格式的正确姿势。比如你要的ISO格式可以这么写:

// 先确保用UTC时间,避免时区问题
DateTime utcDateTime = DateTime.UtcNow;
// 用标准ISO 8601格式字符串生成结果
string isoFormattedDate = utcDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");

如果怕当前区域性影响格式(比如有些区域会把/换成-之类的),可以指定InvariantCulture进一步确保一致性:

using System.Globalization;

string isoFormattedDate = utcDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture);

2. 从GetDateTimeFormats()结果中过滤匹配(不推荐生产用)

如果只是想确认目标格式是否在GetDateTimeFormats()的返回列表里,或者一定要从这个列表里捞结果,可以通过内容匹配的方式过滤,而不是依赖索引。比如:

using System.Linq;

// 用一个测试日期,方便验证格式
DateTime testDate = new DateTime(2023, 10, 5, 14, 30, 45, 123);
// 定义你要的目标格式字符串
string targetFormat = "yyyy-MM-ddTHH:mm:ss.fffZ";
// 获取所有格式
string[] allFormats = testDate.GetDateTimeFormats();

// 找到和目标格式输出一致的结果
var matchedFormat = allFormats.FirstOrDefault(f => f == testDate.ToString(targetFormat));

if (matchedFormat != null)
{
    Console.WriteLine($"找到匹配的格式:{matchedFormat}");
}
else
{
    Console.WriteLine("当前区域性的格式列表中没有目标格式");
}

不过要注意:这种方法依然受区域性限制——有些区域性的格式列表里可能根本没有你要的ISO格式,而且每次返回的列表顺序都可能变,所以绝对不能用索引来硬取,只能靠内容匹配。

为什么索引不可靠?

正如你看到的方法备注,GetDateTimeFormats()的输出完全依赖当前线程的CultureInfo,不同语言、不同区域的系统返回的格式列表顺序和内容都不一样。比如在英文系统里索引5是短日期格式,到中文系统里可能就变成了长日期格式,完全没有稳定性可言。

总结一下:如果明确知道要什么格式,直接用ToString()加自定义格式字符串是最优解;GetDateTimeFormats()更适合用来查看当前系统支持的所有格式,而不是获取特定格式。

内容的提问来源于stack exchange,提问作者donutguy640

火山引擎 最新活动