如何从完整的月名得到短的月名
本文关键字: | 更新日期: 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 />");
}