簡體   English   中英

如何將月份名稱(字符串)解析為整數以在 C# 中進行比較?

[英]How to parse a month name (string) to an integer for comparison in C#?

我需要能夠比較數組中的一些月份名稱。

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

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

我的谷歌搜索似乎表明唯一的方法是編寫自己的方法,但這似乎是一個足夠普遍的問題,我認為它已經在 .Net 中實現了,以前有人這樣做過嗎?

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

雖然,出於您的目的,您最好創建一個Dictionary<string, int>將月份的名稱映射到其值。

你可以這樣做:

Convert.ToDate(month + " 01, 1900").Month

如果您使用幾個人建議的DateTime.ParseExact() -方法,您應該仔細考慮當應用程序在非英語環境中運行時您希望發生什么!

在丹麥, ParseExact("Januar", ...)ParseExact("January", ...)哪一個應該工作,哪一個應該失敗?

這將是CultureInfo.CurrentCultureCultureInfo.InvariantCulture之間的區別。

一個簡單的解決方案是創建一個帶有名稱和值的字典。 然后使用 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;
    }
}

您可以使用 DateTime.Parse 方法獲取 DateTime 對象,然后檢查其 Month 屬性。 做這樣的事情:

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

訣竅是建立一個有效的日期來創建一個 DateTime 對象。

您可以使用月份的枚舉:

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

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

不過,我不是 100% 確定 enum.Parse() 的語法。

您不必創建 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。

在提出問題七年后回答這個問題,可以使用內置方法進行比較:

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

我將其翻譯成西班牙語版本的 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";

        }

   }

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

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 版。

我所做的是使用 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();

此代碼可幫助您...

using System.Globalization;

....

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

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

如果您想將月份作為整數,則只需使用 -

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

希望對你有幫助!!!

謝謝!!!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM