gpt4 book ai didi

c# - 使用自定义 IFormatProvider 的 DateTime.ToString() 中月份的第一个字母

转载 作者:太空狗 更新时间:2023-10-29 23:06:46 27 4
gpt4 key购买 nike

在 DateTime 格式字符串中有没有办法只包含月份的第一个字母?

new DateTime(2015, 1, 12).ToString("M-dd-yy") // "1-12-15",  but I want "J-02-15"
new DateTime(2000, 11, 7).ToString("M-dd-yy") // "11-07-00", but I want "N-17-00"

如果没有,是否有某种方法可以向系统范围的 IFormatProvider 添加新的自定义格式来处理这个问题?

注意“你为什么要那样做?” people: 这是供应商的图表控件,只接受格式字符串。我们正在努力使这些日期尽可能短,并且它们是针对国际用户的,因此月份的数字将不起作用。我无法传入新的 IFormatProvider,因此我必须以某种方式修改现有的 IFormatProvider(希望不要破坏它)。

最佳答案

让我们深入了解一下DateTime.ToString() 的实现。当没有 IFormatProvider 对象传递给它时,它将使用 System.Globalization.DateTimeFormatInfo.CurrentInfo 作为 DateTimeFormatInfo对象以获取有关如何构建字符串表示的信息。 CurrentInfo 又从 Thread.CurrentThread.CurrentCulture 中获取。

因此,您希望以一种方式设置当前线程文化,使其具有一个字符的月份名称(或缩写,如下例所示),然后使用常规范式字符串。实现此目的的一种方法如下:

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

namespace DTFTest
{
class Program
{
static void Main(string[] args)
{
var dt = DateTime.Now;
Thread.CurrentThread.CurrentCulture = new CultureInfo("EN-US", true);
var ci = Thread.CurrentThread.CurrentCulture;
var monthNames = new[] { "J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D", string.Empty };
ci.DateTimeFormat.AbbreviatedMonthNames = monthNames;
Console.WriteLine(dt.ToString("MMM-dd-yyyy"));
}
}
}

关于c# - 使用自定义 IFormatProvider 的 DateTime.ToString() 中月份的第一个字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29708626/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com