我怎样才能得到 MediumDateString?
How can I get a MediumDateString?
我可以将 YYYYMMDD 格式的字符串值转换为更人性化的字符串,如下所示:
string beginDate = GetElement(3, fileBaseName);
string endDate = GetElement(4, fileBaseName);
beginDate = DateTime.ParseExact(beginDate,
"yyyyMMdd",
CultureInfo.InvariantCulture).ToShortDateString();
endDate = DateTime.ParseExact(endDate,
"yyyyMMdd",
CultureInfo.InvariantCulture).ToShortDateString();
return string.Format("{0} to {1}", beginDate, endDate);
但是使用 ToShortDateString() 如上所述,我得到了不如预期的友好格式 "4/1 /2016 至 4/30/2016"
当我尝试 ToLongDateString() 时,它在另一个方向上走得太远,将数字扩展为月份名称(我想要的),但也提供了长格式星期几,因此相同的值显示为“2016 年 4 月 1 日星期五至 2016 年 4 月 30 日星期六”
我真正想要的是将日期范围显示为“2016 年 4 月 1 日至 2016 年 4 月 30 日”(或“2016 年 4 月 1 日至 2016 年 4 月 30 日”)
我可以使用 ToShortDateString() 和 ToLongDateString() 之间的中间地带,还是我需要 "roll my own" 得到这个?
您可以使用自己的自定义格式 (MMMM d, yyyy
):
beginDate = DateTime.ParseExact(beginDate,
"yyyyMMdd",
CultureInfo.InvariantCulture)
.ToString("MMMM d, yyyy");
endDate = DateTime.ParseExact(endDate,
"yyyyMMdd",
CultureInfo.InvariantCulture)
.ToString("MMMM d, yyyy");
return string.Format("{0} to {1}", beginDate, endDate);
输出:
April 1, 2016 to April 30, 2016
不,.NET 中这两者之间没有任何区别 - 如果您查看 DateTimeFormatInfo
you'll see ShortDatePattern
and LongDatePattern
,但没有 "medium date pattern"。
如果您了解需要处理的所有区域性,则可以自定义每种区域性的显示 - 但我会避免在您不了解相关区域性的情况下指定自定义格式字符串。 (如果您了解某些文化但不了解其他文化,则可以为您所了解的人硬编码格式字符串,而只对其他人使用长模式或短模式 - 所以它不会提供很好的体验,但至少你不会无意中做一些在文化上非常无能的事情。)
为了得到我想要的(在第一个月之前没有前缀“0”)我确实需要 "roll my own" 因此:
private static string ToMediumDateString(string _date)
{
string yearPortion = _date.Substring(0, 4);
int monthNum = Convert.ToInt32(_date.Substring(4, 2));
int dayNum = Convert.ToInt32(_date.Substring(6, 2));
string monthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(monthNum);
return String.Format("{0} {1}, {2}", monthName, dayNum, yearPortion);
}
我可以将 YYYYMMDD 格式的字符串值转换为更人性化的字符串,如下所示:
string beginDate = GetElement(3, fileBaseName);
string endDate = GetElement(4, fileBaseName);
beginDate = DateTime.ParseExact(beginDate,
"yyyyMMdd",
CultureInfo.InvariantCulture).ToShortDateString();
endDate = DateTime.ParseExact(endDate,
"yyyyMMdd",
CultureInfo.InvariantCulture).ToShortDateString();
return string.Format("{0} to {1}", beginDate, endDate);
但是使用 ToShortDateString() 如上所述,我得到了不如预期的友好格式 "4/1 /2016 至 4/30/2016"
当我尝试 ToLongDateString() 时,它在另一个方向上走得太远,将数字扩展为月份名称(我想要的),但也提供了长格式星期几,因此相同的值显示为“2016 年 4 月 1 日星期五至 2016 年 4 月 30 日星期六”
我真正想要的是将日期范围显示为“2016 年 4 月 1 日至 2016 年 4 月 30 日”(或“2016 年 4 月 1 日至 2016 年 4 月 30 日”)
我可以使用 ToShortDateString() 和 ToLongDateString() 之间的中间地带,还是我需要 "roll my own" 得到这个?
您可以使用自己的自定义格式 (MMMM d, yyyy
):
beginDate = DateTime.ParseExact(beginDate,
"yyyyMMdd",
CultureInfo.InvariantCulture)
.ToString("MMMM d, yyyy");
endDate = DateTime.ParseExact(endDate,
"yyyyMMdd",
CultureInfo.InvariantCulture)
.ToString("MMMM d, yyyy");
return string.Format("{0} to {1}", beginDate, endDate);
输出:
April 1, 2016 to April 30, 2016
不,.NET 中这两者之间没有任何区别 - 如果您查看 DateTimeFormatInfo
you'll see ShortDatePattern
and LongDatePattern
,但没有 "medium date pattern"。
如果您了解需要处理的所有区域性,则可以自定义每种区域性的显示 - 但我会避免在您不了解相关区域性的情况下指定自定义格式字符串。 (如果您了解某些文化但不了解其他文化,则可以为您所了解的人硬编码格式字符串,而只对其他人使用长模式或短模式 - 所以它不会提供很好的体验,但至少你不会无意中做一些在文化上非常无能的事情。)
为了得到我想要的(在第一个月之前没有前缀“0”)我确实需要 "roll my own" 因此:
private static string ToMediumDateString(string _date)
{
string yearPortion = _date.Substring(0, 4);
int monthNum = Convert.ToInt32(_date.Substring(4, 2));
int dayNum = Convert.ToInt32(_date.Substring(6, 2));
string monthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(monthNum);
return String.Format("{0} {1}, {2}", monthName, dayNum, yearPortion);
}