【问题标题】:How to get short month name from full month name?如何从完整的月份名称中获取短月份名称?
【发布时间】:2014-08-21 06:57:03
【问题描述】:

我需要获取完整月份名称的短月份名称。

例如,

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

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

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

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

【问题讨论】:

  • 循环几个月?
  • "这两个代码只用于获取当前月份。我需要获取所有月份的短月份名称。" - 所以某种循环结构似乎是合适的......
  • 并填充类似结构的哈希图(字典 IIRC)
  • 创建一个字典或类可能要容易得多,它包含两个部分并返回您想要的结果,它只有 12 个条目,所以不应该太费力
  • If I give "agosto", it should return "ago.". How could I achieve this? 我认为 OP 想要一个函数来将月份的全名解析为缩写。

标签: c# .net datetime


【解决方案1】:

不使用循环的Soneranswer 的替代方案:

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

【讨论】:

  • +1,是的,这似乎比我的好。
  • @SonerGönül 也许在我们之间,我们会得到与完全错误的答案一样多的支持......
【解决方案2】:

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

缩写月份名称:

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

全月名称:

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

【讨论】:

    【解决方案3】:

    试试这个方法

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

    【讨论】:

    • 对不起,但我不明白为什么这个答案如此受欢迎。是的,它得到所有缩写的月份名称,但 OP 不想要这个。他/她想从他的CurrentCulture 的完整月份名称中获取缩写月份名称。我也不明白你为什么使用en-US文化。
    • 对不起,如果您的回答得到任何支持。:P .. 其实我的回答只是一个例子。我用美国英语作为一种文化。 OP 可以为 CurrentCulture 尝试相同的方法。
    • 获得支持不是重点。重点是;尝试给出正确的答案。这个根本没有回答问题。
    【解决方案4】:

    如果我给出“agosto”,它应该返回“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")这样称呼它;

    【讨论】:

    • 当您在参数中有全名时,我不明白foreach 和比较的原因。就用它...
    • @Xaruth 我认为这对于 OP 如何获取这些值更容易理解。如果您正在寻找更清洁/更好的解决方案,请同时查看Rawling's answer
    【解决方案5】:

    如果我正确理解您的问题,您想传递一个函数月份的全名,并获取月份的简称?

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

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

    部分代码借鉴自this answer

    【讨论】:

    • 如果MonthLongName 不是他的CurrentCulture 的有效完整月份名称,则会引发异常。
    • 确实会的。我将更新我的答案以包含该花絮。
    • 添加一个try catch 就完美了。
    • 我故意将 try/catch 留给这个例子,因为不管它是否在这个函数中,都需要在某个地方进行验证。即使我们在 catch 中返回了 String.Empty,OP 也需要在他的代码中处理它。
    【解决方案6】:

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

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

    【讨论】:

    • 这有一个缺点,即结果会根据当前月份改变它的顺序。创建一个设置为一月的变量,如下所示: var test = new DateTime(2014,1,1)
    • 嗨,Christian,同意,但这取决于用户的用例。如果她/他需要填充下拉列表来选择月份,那么这种方法会很有效。即将当前月份显示为第一个选项。
    • 所以,这将从现在开始获取所有缩写名称。然后呢?重点是什么?根本不回答问题。
    【解决方案7】:

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

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

    【讨论】:

      【解决方案8】:

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

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

      由于我不想在资源中添加月份和日期,因此转换从 Invariant long(我在 XAML 元素的“标签”中拥有)到短 Current 文化(在“内容”中需要) ) 从而节省额外的翻译

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

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

      }

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

        • 这似乎是错误的?它将以包含日、月和年的格式返回当前日期,而不是所有月份的短月份
        【解决方案10】:

        这是你需要的:

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

        【讨论】:

        • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
        【解决方案11】:
        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 />");
        }
        

        【讨论】:

        • 抱歉只显示代码。我的理解是你想在一年中的每个月从长月份名称变为短月份名称。因此,我举了一个关于在“Dat”变量中添加一个常量日期的示例。然后,制作“for循环”。请检查我编辑的代码。
        猜你喜欢
        • 2011-10-09
        • 1970-01-01
        • 2011-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-01
        相关资源
        最近更新 更多