C# 如何从完整月份名称中获取短月份名称?
我需要得到完整月份名称的短月份名称 比如说,C# 如何从完整月份名称中获取短月份名称?,c#,.net,datetime,C#,.net,Datetime,我需要得到完整月份名称的短月份名称 比如说, DateTime.Now.ToString("MMMM", CultureInfo.CurrentCulture); this returns - "agosto" DateTime.Now.ToString("MMM", CultureInfo.CurrentCulture); this returns - "ago." 这两个代码仅用于获取当前月份。我需要得到所有月份的短月份名称 如果我给了“agosto”,它应该返回“ago。”。我怎样才能
DateTime.Now.ToString("MMMM", CultureInfo.CurrentCulture);
this returns - "agosto"
DateTime.Now.ToString("MMM", CultureInfo.CurrentCulture);
this returns - "ago."
这两个代码仅用于获取当前月份。我需要得到所有月份的短月份名称 如果我给了
“agosto”
,它应该返回“ago。”
。我怎样才能做到这一点呢?试试这种方法
var culture = CultureInfo.GetCultureInfo("en-US");
var dateTimeInfo = DateTimeFormatInfo.GetInstance(culture);
foreach (string name in dateTimeInfo.AbbreviatedMonthNames)
{
Console.WriteLine(name);
}
如果您想要所有月份名称,可以使用以下内容:
for (int i = 0; i < 12; i++)
{
Console.WriteLine(DateTime.Now.AddMonths(i).ToString("MMM"));
}
for(int i=0;i<12;i++)
{
Console.WriteLine(DateTime.Now.AddMonths(i).ToString(“MMM”);
}
如果我正确理解了您的问题,您想将月份的全名传递给函数,并获取月份的简称吗
此方法假定传递的MonthLongName是当前区域性中的有效月份名称。
如果不是,它将抛出异常。如果有可能的话,做一些验证
public String GetMonthShortName(String MonthLongName)
{
return DateTime.ParseExact(MonthLongName, "MMMM", CultureInfo.CurrentCulture ).ToString("MMM", CultureInfo.CurrentCulture);
}
从CultureInfo ci=CultureInfo.CreateSpecificCulture(“en-US”)借用的一些代码;
DateTimeFormatInfo abrv=ci.DateTimeFormat;
DateTime dat=新的日期时间(2014,1,1);
对于(int ctr=0;ctr ”;
}
如果我给“agosto”,它应该返回“ago”
然后你可以用like
然后可以像get缩写fromfullname(“agosto”)
那样调用它 不使用循环的替代方案:
public static string GetAbbreviatedFromFullName(string fullname)
{
DateTime month;
return DateTime.TryParseExact(
fullname,
"MMMM",
CultureInfo.CurrentCulture,
DateTimeStyles.None,
out month)
? month.ToString("MMM")
: null;
}
CultureInfo
已包含表示完整和缩写月份名称的数组:
CultureInfo.CurrentCulture.DateTimeFormat.AbbreviatedMonthNames[
Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
t => t.Equals("agosto", StringComparison.CurrentCultureIgnoreCase))];
我遇到了同样的问题,为了完整性,我想添加我的解决方案(基于@Rawling的答案) 因为我需要在XAML中进行转换,所以我编写了以下转换器 由于我不想在资源中添加数月和数天,因此转换将从不变长(我在XAML元素的“标记”中有)转换为短当前区域性(在“内容”中需要),从而节省额外的翻译 我还按照同样的思路为工作日创建了一个转换器
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;
}
}
使用系统;
利用制度全球化;
使用System.Windows.Data;
命名空间Rittal.RiZone.GUI.ValueConverters
{
公共级LongtosortmonthConverter:IValueConverter
{
///
///
///
///来自不变量区域性的长月份名称
///
///
///
///CurrentCulture中月份的短文本表示形式;如果未找到匹配项,则为null
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
if(value==null)返回null;
日期时间月份;
return DateTime.TryParseExact(
value.ToString(),
“嗯”,
CultureInfo.InvariantCulture,
DateTimeStyles。无,
外月)
?月至字符串(“MMM”,文化信息。当前文化)
:null;
}
///
///
///
///来自CurrentCulture的短月份名称
///
///
///
///不变量区域性中月份的长文本表示形式;如果未找到匹配项,则为null
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
if(value==null)返回null;
日期时间月份;
return DateTime.TryParseExact(
value.ToString(),
“嗯”,
CultureInfo.CurrentCulture,
DateTimeStyles。无,
外月)
?月ToString(“mm”,CultureInfo.InvariantCulture)
:null;
}
}
}DateTime.Now.ToString(“dd-MMM-yyyy”);
这返回“agosto”
DateTime.Now.ToString(“dd-MMM-yyyy”);
这返回“以前” 这就是您需要的:
var dateUtil = DateTimeFormatInfo.GetInstance(CultureInfo.CurrentCulture);
return dateUtil.AbbreviatedMonthNames[DateTime.Now.Month -1];
如果你能得到月数,这种方法很容易得到缩写名或全名 缩写月份名称:
CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(DateTime.Today.Month)
CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(DateTime.Today.Month)
全名:
CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(DateTime.Today.Month)
CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(DateTime.Today.Month)
循环月份?“这两个代码只用于获取当前月份。我需要获取所有月份的短月份名称。”-因此某种循环构造似乎是合适的…并填充类似hashmap的结构(Dictionary IIRC)可能更容易创建字典或类,这两个部分都有,将返回您想要的结果,它将只有12个条目,因此不应该太费力
如果我给“agosto”,它应该返回“ago”。我怎样才能做到这一点?
我想OP需要一个函数将月份的全名解析为缩写。这有一个缺点,即结果会根据当前月份的不同而改变其顺序。创建一个设置为1月的变量,如下所示:var test=new DateTime(2014,1,1)Hi Christian,同意,但这取决于用户的用例。如果他/她需要填充一个下拉列表来选择一个月,那么这种方法将很好地工作。i、 显示当前月份作为第一个选项。因此,从现在开始获取所有缩写名称。然后呢?重点是什么?根本不回答问题。如果MonthLongName
不是其CurrentCulture
的有效全月名,则会引发异常。确实会。我将更新我的答案,以包含该小贴士。添加一个try-catch
,它将是完美的。我故意在这个示例中保留try/catch,因为无论它是否在这个函数中,都需要在某处进行验证。即使我们在catch中返回了一个字符串.Empty
,OP也需要在他的代码中处理这个问题。对不起,我不明白为什么这个答案会被如此高的投票率。是的,它有所有缩写的月份名称,但OP不想要这个。他/她希望从其当前文化的完整月份名称中获得缩写月份名称。我也不明白你为什么要使用美国文化。对不起,如果你的答案没有得到任何支持的话。:P。。其实我的回答只是一个例子。我把英语作为一种文化。OP可以对CurrentCulture尝试相同的方法。获得投票权不是唯一的选择