99

我需要能够比较数组中的一些月份名称。

如果有一些直接的方式,那就太好了:

Month.toInt("January") > Month.toInt("May")

我的谷歌搜索似乎表明唯一的方法是编写自己的方法,但这似乎是一个很常见的问题,我认为它已经在 .Net 中实现了,以前有人这样做过吗?

4

14 回答 14

189

DateTime.ParseExact(monthName, "MMMM", CultureInfo.CurrentCulture ).Month

虽然,出于您的目的,您最好只创建Dictionary<string, int>月份名称与其值的映射。

于 2008-11-03T14:40:18.793 回答
22

你可以这样做:

Convert.ToDate(month + " 01, 1900").Month
于 2008-11-03T14:42:23.530 回答
19

如果你使用DateTime.ParseExact()几个人建议的 - 方法,你应该仔细考虑当应用程序在非英语环境中运行时你想要发生什么!

在丹麦,哪些ParseExact("Januar", ...)应该ParseExact("January", ...)有效,哪些应该失败?

CultureInfo.CurrentCulture这将是和之间的区别CultureInfo.InvariantCulture

于 2008-11-03T14:58:58.943 回答
10

一个简单的解决方案是创建一个包含名称和值的字典。然后使用 Contains() 可以找到正确的值。

Dictionary<string, string> months = new Dictionary<string, string>()
{
                { "january", "01"},
                { "february", "02"},
                { "march", "03"},
                { "april", "04"},
                { "may", "05"},
                { "june", "06"},
                { "july", "07"},
                { "august", "08"},
                { "september", "09"},
                { "october", "10"},
                { "november", "11"},
                { "december", "12"},
};
foreach (var month in months)
{
    if (StringThatContainsMonth.ToLower().Contains(month.Key))
    {
        string thisMonth = month.Value;
    }
}
于 2015-05-06T23:48:51.610 回答
9

您可以使用 DateTime.Parse 方法获取 DateTime 对象,然后检查其 Month 属性。做这样的事情:

int month = DateTime.Parse("1." + monthName + " 2008").Month;

诀窍是建立一个有效的日期来创建一个 DateTime 对象。

于 2008-11-03T14:43:48.893 回答
9

您可以使用几个月的枚举:

public enum Month
{
    January,
    February,
    // (...)
    December,
}    

public Month ToInt(Month Input)
{
    return (int)Enum.Parse(typeof(Month), Input, true));
}

不过,我不是 100% 确定 enum.Parse() 的语法。

于 2008-11-03T14:47:04.597 回答
7

您不必创建 DateTime 实例来执行此操作。就这么简单:

public static class Month
{
    public static int ToInt(this string month)
    {
        return Array.IndexOf(
            CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
            month.ToLower(CultureInfo.CurrentCulture))
            + 1;
    }
}

我在da-DK文化上运行,所以这个单元测试通过了:

[Theory]
[InlineData("Januar", 1)]
[InlineData("Februar", 2)]
[InlineData("Marts", 3)]
[InlineData("April", 4)]
[InlineData("Maj", 5)]
[InlineData("Juni", 6)]
[InlineData("Juli", 7)]
[InlineData("August", 8)]
[InlineData("September", 9)]
[InlineData("Oktober", 10)]
[InlineData("November", 11)]
[InlineData("December", 12)]
public void Test(string monthName, int expected)
{
    var actual = monthName.ToInt();
    Assert.Equal(expected, actual);
}

我将把它作为练习留给读者创建一个重载,您可以在其中传递一个显式的 CultureInfo。

于 2012-09-22T20:32:45.533 回答
2

在提出问题七年后回答这个问题,可以使用内置方法进行比较:

Month.toInt("January") > Month.toInt("May")

变成

Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
                 t => t.Equals("January", StringComparison.CurrentCultureIgnoreCase)) >
Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
                 t => t.Equals("May", StringComparison.CurrentCultureIgnoreCase))

为简单起见,可以将其重构为扩展方法。以下是一个 LINQPad 示例(因此Dump()方法调用):

void Main()
{
    ("January".GetMonthIndex() > "May".GetMonthIndex()).Dump();
    ("January".GetMonthIndex() == "january".GetMonthIndex()).Dump();
    ("January".GetMonthIndex() < "May".GetMonthIndex()).Dump();
}

public static class Extension {
    public static int GetMonthIndex(this string month) {
        return Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
                         t => t.Equals(month, StringComparison.CurrentCultureIgnoreCase));
    }
}

带输出:

False
True
True
于 2015-06-11T02:22:28.827 回答
1

如果您使用的是 c# 3.0(或更高版本),您可以使用扩展程序

于 2008-11-03T14:36:35.243 回答
1
Public Function returnMonthNumber(ByVal monthName As String) As Integer
    Select Case monthName.ToLower
        Case Is = "january"
            Return 1
        Case Is = "february"
            Return 2
        Case Is = "march"
            Return 3
        Case Is = "april"
            Return 4
        Case Is = "may"
            Return 5
        Case Is = "june"
            Return 6
        Case Is = "july"
            Return 7
        Case Is = "august"
            Return 8
        Case Is = "september"
            Return 9
        Case Is = "october"
            Return 10
        Case Is = "november"
            Return 11
        Case Is = "december"
            Return 12
        Case Else
            Return 0
    End Select
End Function

警告代码为 Beta 版本。

于 2010-11-09T10:28:17.913 回答
1

我将它翻译成西班牙语版本的 C# 代码,问候:

public string ObtenerNumeroMes(string NombreMes){

       string NumeroMes;   

       switch(NombreMes) {

        case ("ENERO") :
            NumeroMes = "01";
            return NumeroMes;

        case ("FEBRERO") :
            NumeroMes = "02";
            return NumeroMes;

        case ("MARZO") :
            NumeroMes = "03";
            return NumeroMes;

        case ("ABRIL") :
            NumeroMes = "04";
            return NumeroMes;

        case ("MAYO") :
            NumeroMes = "05";
            return NumeroMes;

        case ("JUNIO") :
            NumeroMes = "06";
            return NumeroMes;

        case ("JULIO") :
            NumeroMes = "07";
            return NumeroMes;

        case ("AGOSTO") :
            NumeroMes = "08";
            return NumeroMes;

        case ("SEPTIEMBRE") :
            NumeroMes = "09";
            return NumeroMes;

        case ("OCTUBRE") :
            NumeroMes = "10";
            return NumeroMes;

        case ("NOVIEMBRE") :
            NumeroMes = "11";
            return NumeroMes;

        case ("DICIEMBRE") :
            NumeroMes = "12";
            return NumeroMes;

            default:
            Console.WriteLine("Error");
            return "ERROR";

        }

   }
于 2013-04-23T16:38:01.373 回答
0

我所做的是使用 SimpleDateFormat 创建格式字符串,并将文本解析为日期,然后从中检索月份。代码如下:

int year = 2012 \\or any other year
String monthName = "January" \\or any other month
SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy");
int monthNumber = format.parse("01-" + monthName + "-" + year).getMonth();
于 2012-09-07T05:58:41.947 回答
0

此代码可以帮助您...

using System.Globalization;

....

string FullMonthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(DateTime.UtcNow.Month);

GetMonthName 方法 - 它返回字符串...

如果您想将月份作为整数,则只需使用 -

DateTime dt= DateTime.UtcNow;
int month= dt.Month;

希望对你有帮助!!!

谢谢!!!

于 2019-11-06T07:53:13.770 回答
0
int selectedValue = 0;
            switch (curentMonth)
            {
                case "January":
                    selectedValue = 1;
                    break;
                case "February":
                    selectedValue = 2;
                    break;
            }
            if (selectedValue != 0)
            {
               /* var list= db.model_name.Where(x => x.column== selectedValue);
                return list; */
            }
            return Ok(selectedValue);
于 2021-06-03T12:35:40.407 回答