如何从完整的月名得到短的月名

本文关键字: | 更新日期: 2023-09-27 18:18:52

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

例如,

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

这两个代码只用于获取当前月份。我需要所有月份的缩写。

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

如何从完整的月名得到短的月名

不使用循环的Soner答案的替代方案:

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

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

缩写月名:

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

全月名称:

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

试试这个

var culture = CultureInfo.GetCultureInfo("en-US");
var dateTimeInfo = DateTimeFormatInfo.GetInstance(culture);
foreach (string name in dateTimeInfo.AbbreviatedMonthNames)
{
    Console.WriteLine(name);
}

如果我给"ago ",它应该返回"ago "。"

则可以使用DateTimeFormatInfo.MonthNames,如;

public static string GetAbbreviatedFromFullName(string fullname)
{
    string[] names = DateTimeFormatInfo.CurrentInfo.MonthNames;
    foreach (var item in names)
    {
        if (item == fullname)
        {
            return DateTime.ParseExact(item, "MMMM", CultureInfo.CurrentCulture)
                                 .ToString("MMM");
        }
    }
    return string.Empty;
}

然后可以称之为GetAbbreviatedFromFullName("agosto");

如果我正确理解你的问题,你想传递一个函数月的全名,并获得月的短名?

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

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

从这个答案中借用了一些代码

如果需要所有月份的名称,可以使用如下命令:

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

CultureInfo已经有了表示全名和缩写月名的数组:

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

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

由于我需要在XAML中进行转换,所以我编写了以下转换器:

由于我不想在资源中添加月份和天数,因此转换从恒常长(我在XAML元素的"Tag"中有)转换为短的当前文化(在"Content"中需要),从而节省了额外的翻译

我还创建了一个工作日的转换器。

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;
    }
}

}

DateTime.Now。ToString(" add MMM yyyy");返回- "agosto";

DateTime.Now。ToString(" add MMM yyyy");返回- "ago.";

这就是你需要的:

var dateUtil = DateTimeFormatInfo.GetInstance(CultureInfo.CurrentCulture);
return dateUtil.AbbreviatedMonthNames[DateTime.Now.Month -1];
CultureInfo ci = CultureInfo.CreateSpecificCulture("en-US");
DateTimeFormatInfo abrv = ci.DateTimeFormat;
DateTime dat = new DateTime(2014, 1, 1);
for (int ctr = 0; ctr < abrv.Calendar.GetMonthsInYear(dat.Year); ctr++) {
     Response.Write(dat.AddMonths(ctr).ToString("MMM", abrv) + "<br />");
}
相关文章:
  • 没有找到相关文章