C# 如何从完整月份名称中获取短月份名称?

C# 如何从完整月份名称中获取短月份名称?,c#,.net,datetime,C#,.net,Datetime,我需要得到完整月份名称的短月份名称 比如说, DateTime.Now.ToString("MMMM", CultureInfo.CurrentCulture); this returns - "agosto" DateTime.Now.ToString("MMM", CultureInfo.CurrentCulture); this returns - "ago." 这两个代码仅用于获取当前月份。我需要得到所有月份的短月份名称 如果我给了“agosto”,它应该返回“ago。”。我怎样才能

我需要得到完整月份名称的短月份名称

比如说,

DateTime.Now.ToString("MMMM", CultureInfo.CurrentCulture);
this returns - "agosto"

DateTime.Now.ToString("MMM", CultureInfo.CurrentCulture);
this returns - "ago."

这两个代码仅用于获取当前月份。我需要得到所有月份的短月份名称

如果我给了
“agosto”
,它应该返回
“ago。”
。我怎样才能做到这一点呢?

试试这种方法

var culture = CultureInfo.GetCultureInfo("en-US");
var dateTimeInfo = DateTimeFormatInfo.GetInstance(culture);

foreach (string name in dateTimeInfo.AbbreviatedMonthNames)
{
    Console.WriteLine(name);
}

如果您想要所有月份名称,可以使用以下内容:

for (int i = 0; i < 12; i++)
{
    Console.WriteLine(DateTime.Now.AddMonths(i).ToString("MMM"));
}
for(int i=0;i<12;i++)
{
Console.WriteLine(DateTime.Now.AddMonths(i).ToString(“MMM”);
}

如果我正确理解了您的问题,您想将月份的全名传递给函数,并获取月份的简称吗

此方法假定传递的MonthLongName是当前区域性中的有效月份名称。 如果不是,它将抛出异常。如果有可能的话,做一些验证

public String GetMonthShortName(String MonthLongName)
{
    return DateTime.ParseExact(MonthLongName, "MMMM", CultureInfo.CurrentCulture ).ToString("MMM", CultureInfo.CurrentCulture);
}

CultureInfo ci=CultureInfo.CreateSpecificCulture(“en-US”)借用的一些代码;
DateTimeFormatInfo abrv=ci.DateTimeFormat;
DateTime dat=新的日期时间(2014,1,1);
对于(int ctr=0;ctr”;
}
如果我给“agosto”,它应该返回“ago”

然后你可以用like

然后可以像
get缩写fromfullname(“agosto”)
那样调用它

不使用循环的替代方案:

public static string GetAbbreviatedFromFullName(string fullname)
{
    DateTime month;
    return DateTime.TryParseExact(
            fullname,
            "MMMM",
            CultureInfo.CurrentCulture,
            DateTimeStyles.None,
            out month)
        ? month.ToString("MMM")
        : null;
}

CultureInfo
已包含表示完整和缩写月份名称的数组:

CultureInfo.CurrentCulture.DateTimeFormat.AbbreviatedMonthNames[
    Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
                     t => t.Equals("agosto", StringComparison.CurrentCultureIgnoreCase))];

我遇到了同样的问题,为了完整性,我想添加我的解决方案(基于@Rawling的答案)

因为我需要在XAML中进行转换,所以我编写了以下转换器

由于我不想在资源中添加数月和数天,因此转换将从不变长(我在XAML元素的“标记”中有)转换为短当前区域性(在“内容”中需要),从而节省额外的翻译

我还按照同样的思路为工作日创建了一个转换器

using System;
using System.Globalization;
using System.Windows.Data;

namespace Rittal.RiZone.GUI.ValueConverters
{
    public class LongToShortMonthConverter : IValueConverter
    {
    /// <summary>
    /// 
    /// </summary>
    /// <param name="value">Long month name from InvariantCulture</param>
    /// <param name="targetType"></param>
    /// <param name="parameter"></param>
    /// <param name="culture"></param>
    /// <returns>Short text representation of the month in CurrentCulture; null in case no match was found</returns>
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return null;

        DateTime month;
        return DateTime.TryParseExact(
            value.ToString(),
            "MMMM",
            CultureInfo.InvariantCulture,
            DateTimeStyles.None,
            out month)
            ? month.ToString("MMM", CultureInfo.CurrentCulture)
            : null;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="value">Short month name from CurrentCulture</param>
    /// <param name="targetType"></param>
    /// <param name="parameter"></param>
    /// <param name="culture"></param>
    /// <returns>Long text representation of the month in InvariantCulture; null in case no match was found</returns>
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return null;

        DateTime month;
        return DateTime.TryParseExact(
            value.ToString(),
            "MMM",
            CultureInfo.CurrentCulture,
            DateTimeStyles.None,
            out month)
            ? month.ToString("MMMM", CultureInfo.InvariantCulture)
            : null;
    }
}
使用系统;
利用制度全球化;
使用System.Windows.Data;
命名空间Rittal.RiZone.GUI.ValueConverters
{
公共级LongtosortmonthConverter:IValueConverter
{
/// 
/// 
/// 
///来自不变量区域性的长月份名称
/// 
/// 
/// 
///CurrentCulture中月份的短文本表示形式;如果未找到匹配项,则为null
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
if(value==null)返回null;
日期时间月份;
return DateTime.TryParseExact(
value.ToString(),
“嗯”,
CultureInfo.InvariantCulture,
DateTimeStyles。无,
外月)
?月至字符串(“MMM”,文化信息。当前文化)
:null;
}
/// 
/// 
/// 
///来自CurrentCulture的短月份名称
/// 
/// 
/// 
///不变量区域性中月份的长文本表示形式;如果未找到匹配项,则为null
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
if(value==null)返回null;
日期时间月份;
return DateTime.TryParseExact(
value.ToString(),
“嗯”,
CultureInfo.CurrentCulture,
DateTimeStyles。无,
外月)
?月ToString(“mm”,CultureInfo.InvariantCulture)
:null;
}
}
}DateTime.Now.ToString(“dd-MMM-yyyy”); 这返回“agosto”

DateTime.Now.ToString(“dd-MMM-yyyy”); 这返回“以前”

这就是您需要的:

var dateUtil = DateTimeFormatInfo.GetInstance(CultureInfo.CurrentCulture);
return dateUtil.AbbreviatedMonthNames[DateTime.Now.Month -1];

如果你能得到月数,这种方法很容易得到缩写名或全名

缩写月份名称:

 CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(DateTime.Today.Month)
CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(DateTime.Today.Month)
全名:

 CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(DateTime.Today.Month)
CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(DateTime.Today.Month)

循环月份?“这两个代码只用于获取当前月份。我需要获取所有月份的短月份名称。”-因此某种循环构造似乎是合适的…并填充类似hashmap的结构(Dictionary IIRC)可能更容易创建字典或类,这两个部分都有,将返回您想要的结果,它将只有12个条目,因此不应该太费力
如果我给“agosto”,它应该返回“ago”。我怎样才能做到这一点?
我想OP需要一个函数将月份的全名解析为缩写。这有一个缺点,即结果会根据当前月份的不同而改变其顺序。创建一个设置为1月的变量,如下所示:var test=new DateTime(2014,1,1)Hi Christian,同意,但这取决于用户的用例。如果他/她需要填充一个下拉列表来选择一个月,那么这种方法将很好地工作。i、 显示当前月份作为第一个选项。因此,从现在开始获取所有缩写名称。然后呢?重点是什么?根本不回答问题。如果
MonthLongName
不是其
CurrentCulture
的有效全月名,则会引发异常。确实会。我将更新我的答案,以包含该小贴士。添加一个
try-catch
,它将是完美的。我故意在这个示例中保留try/catch,因为无论它是否在这个函数中,都需要在某处进行验证。即使我们在catch中返回了一个
字符串.Empty
,OP也需要在他的代码中处理这个问题。对不起,我不明白为什么这个答案会被如此高的投票率。是的,它有所有缩写的月份名称,但OP不想要这个。他/她希望从其当前文化的完整月份名称中获得缩写月份名称。我也不明白你为什么要使用美国文化。对不起,如果你的答案没有得到任何支持的话。:P。。其实我的回答只是一个例子。我把英语作为一种文化。OP可以对CurrentCulture尝试相同的方法。获得投票权不是唯一的选择