【问题标题】:How can I convert a string in the format "YYYYMM" to "MMMYY"?如何将“YYYYMM”格式的字符串转换为“MMMYY”?
【发布时间】:2016-10-18 23:01:36
【问题描述】:

我想将 YYYYMM 格式的值(例如“201509”)传递给函数并检索更人性化的“MMMYY”格式,例如“Sep 2015”。

我认为这可能有效:

internal static string GetMMMYYFromYYYYMM(String YYYYMMVal)
{
    string intermediateStr = YYYYMMVal + "01";
    DateTime intermediateDate = Convert.ToDateTime(intermediateStr);
    return intermediateDate.ToString("MMMyy");
}

...但是不,它会因“字符串未被识别为有效日期时间”而崩溃

ISTM 认为 YYYYMMDD 格式应该是可理解的并且可以转换为 DateTime。我需要改变什么?

更新

由于我没有得到我想要的,我决定像这样“暴力破解”:

internal static string GetMMMYYFromYYYYMM(String YYYYMMVal)
{
    string yearAsTwoChars = YYYYMMVal.Substring(2, 2);
    string threeCharAbbreviation = YYYYMMVal.Substring(4, 2);
    if (threeCharAbbreviation.Equals("01"))
    {
        threeCharAbbreviation = "Jan";
    }
    else if (threeCharAbbreviation.Equals("02"))
    {
        threeCharAbbreviation = "Feb";
    }
    else if (threeCharAbbreviation.Equals("03"))
    {
        threeCharAbbreviation = "Mar";
    }
    else if (threeCharAbbreviation.Equals("04"))
    {
        threeCharAbbreviation = "Apr";
    }
    else if (threeCharAbbreviation.Equals("05"))
    {
        threeCharAbbreviation = "May";
    }
    else if (threeCharAbbreviation.Equals("06"))
    {
        threeCharAbbreviation = "Jun";
    }
    else if (threeCharAbbreviation.Equals("07"))
    {
        threeCharAbbreviation = "Jul";
    }
    else if (threeCharAbbreviation.Equals("08"))
    {
        threeCharAbbreviation = "Aug";
    }
    else if (threeCharAbbreviation.Equals("09"))
    {
        threeCharAbbreviation = "Sep";
    }
    else if (threeCharAbbreviation.Equals("10"))
    {
        threeCharAbbreviation = "Oct";
    }
    else if (threeCharAbbreviation.Equals("11"))
    {
        threeCharAbbreviation = "Nov";
    }
    else if (threeCharAbbreviation.Equals("12"))
    {
        threeCharAbbreviation = "Dec";
    }
    return string.Format("{0} {1}", threeCharAbbreviation, yearAsTwoChars);
}

...虽然它返回我想要的“Sep 15”、“Oct-15”等,但我仍然在我的页面上看到“15-Sep”和“Oct-15”...?!?

我这样调用那个辅助方法:

var monthYearCell = _xlPivotDataSheet.Cells[_lastRowAddedPivotTableData + 1, 4];
monthYearCell.Value2 = ReportRunnerConstsAndUtils.GetMMMYYFromYYYYMM(MonthYear);

我认为 Excel 必须在幕后“自动更正”或其他东西;让我想起了我看过的一部电影(也许是“红军”?),当他的编辑改变他写的内容时,主角变得半弹道。我经常对 Word 和 Excel 有这种感觉。我如何告诉 Excel(假设这是问题所在)不要管它——“我写的,我写的”?

【问题讨论】:

标签: c# datetime datetime-format date-conversion


【解决方案1】:

您应该使用DateTime.ParseExact。所以您的代码将如下所示:

internal static string GetMMMYYFromYYYYMM(String YYYYMMVal)
{
    DateTime intermediateDate = DateTime.ParseExact(YYYYMMVal, "yyyyMM", CultureInfo.InvariantCulture);

    return intermediateDate.ToString("MMMyy");
}

【讨论】:

  • 现在已经足够好了,因为它返回“15-Sep”等;用户最终可能要求的(保留与当前使用的格式相同的格式)是“Sep 15”等。
  • @B.ClayShannon 我刚刚对其进行了测试,如果您想要月份和年份之间的空间,它会按预期返回 Sep15,只需将 ToString 格式更改为“MMM yy”
  • 奇怪;我得到“15-Sep”和“15-Oct”......即使添加空间我得到同样的东西......
  • 我在这里得到了如何解决这个问题的答案:stackoverflow.com/questions/40048382/…
【解决方案2】:

您可以使用switch-case 代替所有那些if-else 块,恕我直言,这会增加可读性。即

switch (threeCharAbbreviation)
{
    case "01":
        threeCharAbbreviation = "Jan";
        break;
    case "02":
        //Etc.
    default:
        break;
}

您可以在 Excel 中明确设置单元格的格式。自己没有测试过,但是你可以试试下面的示例代码:

Excel.Range formatRange;
formatRange = xlWorkSheet.Range["A3", "B4"];
formatRange.NumberFormat = "MM-YY";

【讨论】:

    【解决方案3】:

    试试这个

    return DateTime.ParseExact(intermediateDate.ToString(), "yyyyMM", CultureInfo.InvariantCulture).ToString();
    

    【讨论】:

    • 应该解析YYYYMMVal,而不是intermediateDate.ToString()。 OP 想要返回 string,而不是 DateTime
    • 如果您查看 OP 代码,您会看到传入的参数正在被修改,这就是为什么它正在解析的中间日期
    • intermediateDate 是 OP 需要用解析填充的东西。您打算使用intermediateStr,然后您需要在格式中包含日期部分才能使其正常工作,而您当前拥有的格式应该使用YYYYMMVal,而不需要intermediateStr
    • 我的错,没看到
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2015-10-15
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多