.net 如何在没有工作日的情况下从DateTime获取长日期格式
我正在寻找一种无需工作日就能获得长时间约会的地区感知方式。就这么一头野兽存在吗 下面是我用来获取长日期格式(包括工作日)的代码:.net 如何在没有工作日的情况下从DateTime获取长日期格式,.net,datetime,internationalization,datetime-format,.net,Datetime,Internationalization,Datetime Format,我正在寻找一种无需工作日就能获得长时间约会的地区感知方式。就这么一头野兽存在吗 下面是我用来获取长日期格式(包括工作日)的代码: DateTime time = ... String formattedDate = time.ToLongDateString(); 编辑 我想看到的例子如下: en美国:2009年12月5日 联邦公报:2009年12月5日 es:05 de diciembre de 2009 ToLongDateString()返回以下内容: en美国:2009年12月5
DateTime time = ...
String formattedDate = time.ToLongDateString();
编辑
我想看到的例子如下:
- en美国:2009年12月5日
- 联邦公报:2009年12月5日
- es:05 de diciembre de 2009
- en美国:2009年12月5日,星期六
- fr:samedi 5 décembre 2009
- es:sábado,2009年5月
DateTime time = ....
string formmattedDate = time.Day.ToString() + " " + time.ToString("MMMM");
如果LongDate序列也是特定于区域性的,那么恐怕您运气不好,必须为此编写实际代码。否则,一个集合就可以了 恐怕您需要做的是在本地区域性中创建一个由7个字符串组成的数组(每天一个),然后从LongDate格式输出中删除这些字符串。然后确保删除所有重复的/'s-'和空格
希望有更好的方法,但我看不到。实现这一点的一个非常糟糕、可怕的方法是从现有的LongDatePattern中删除不需要的格式说明符:
public static string CorrectedLongDatePattern(CultureInfo cultureInfo)
{
var info = cultureInfo.DateTimeFormat;
// This is bad, mmmkay?
return Regex.Replace(info.LongDatePattern, "dddd,?",String.Empty).Trim();
}
这似乎奏效了
- 是CultureInfo.DateTimeFormat.LongDatePattern的子字符串
- 不包含“ddd”(短日名称)
- 不包含“dddd”(长日名称)
class DateTest
{
static private string GetDatePatternWithoutWeekday(CultureInfo cultureInfo)
{
string[] patterns = cultureInfo e.DateTimeFormat.GetAllDateTimePatterns();
string longPattern = cultureInfo.DateTimeFormat.LongDatePattern;
string acceptablePattern = String.Empty;
foreach (string pattern in patterns)
{
if (longPattern.Contains(pattern) && !pattern.Contains("ddd") && !pattern.Contains("dddd"))
{
if (pattern.Length > acceptablePattern.Length)
{
acceptablePattern = pattern;
}
}
}
if (String.IsNullOrEmpty(acceptablePattern))
{
return longPattern;
}
return acceptablePattern;
}
static private void Test(string locale)
{
DateTime dateTime = new DateTime(2009, 12, 5);
Thread.CurrentThread.CurrentCulture = new CultureInfo(locale);
string format = GetDatePatternWithoutWeekday(Thread.CurrentThread.CurrentCulture);
string result = dateTime.ToString(format);
MessageBox.Show(result);
}
}
从技术上讲,如果长格式有一天被夹在中间的话,它可能就不起作用了。为此,我应该选择具有最长公共子串的模式,而不是最长精确匹配的模式。有什么问题:
String formattedDate = DateTime.Now.Date.ToLongDateString().Replace(DateTime.Now.DayOfWeek.ToString()+ ", ", "")
var ci = CultureInfo.CreateSpecificCulture("nl-NL");
var date1 = DateTime.ParseExact(date, "dd MMM yyyy", ci);
只需指定格式:
DateTime.ToString("MMMM dd, yyyy");
这是一个古老的thead,但我遇到它是因为它完全符合我需要解决的用例。最后,我写了一段代码,可以正常工作,所以我想我应该为那些需要它的人提供它。(它还有一些额外的技巧,例如默认为当前日期,并允许区域性的完整日期字符串,或删除星期几的字符串):
public string DateString(DateTime?pDt=null,string lang,bool includeDayOfWeek=true)
{
如果(pDt==null)pDt=DateTime.Now;
DateTime dt=(DateTime)pDt;
System.Globalization.CultureInfo culture=null;
试试{culture=newsystem.Globalization.CultureInfo(lang);}
catch{culture=System.Globalization.CultureInfo.InvariantCulture;}
字符串ss=dt.ToString(“D”,区域性);
如果(!包括星期日)
{
//查找星期几字符串,并将其从日期字符串中删除
//(包括任何尾随空格或标点符号)
字符串dow=dt.ToString(“dddd”,culture);
int len=道指长度;
int pos=标准指数(道指);
如果(位置>=0)
{
而((len+pos)
为什么不获取LongDate并删除工作日出现的第一部分
DateTime date = Convert.ToDateTime(content["DisplayDate"]);
//-->3/15/2016 2:09:13 PM
string newDate = date.ToString("D", new CultureInfo("es-ES"));
//--> martes, 15 de marzo de 2016
var index = newDate.IndexOf(",") + 1;
//--> 7
string finalDate = newDate.Substring(index);
//--> 15 de marzo de 2016
旧帖子,但我用的是:
public static string ToLongDateWithoutWeekDayString(this DateTime source)
{
return source.ToLongDateString()
.Replace(source.DayOfWeek.ToString(), "")
.Trim(',', ' ');
}
我已经详细介绍了Bart Calixto提出的解决dd-MMM-yyyy格式问题的建议(在澳大利亚,我们也使用英国日期格式dd/mm/yy) 我还经常需要在Aust和US日期格式之间转换 此代码修复了问题(我的版本是VB) 在调用您需要设置区域性的函数之前,我是在从以下位置获取访问者的国家/地区后这样做的 设置AU或GB后,培养结果为2010年8月18日 设定美国文化后的结果是2010年8月18日 Adam你同意这可以解决你提到的格式问题吗 谢谢,巴特,这是非常好的代码 别忘了将Dim cult添加为System.Globalization.CultureInfo 继承System.Web.UI.Page我的解决方案:
DateTime date = DateTime.Now;
CultureInfo culture = CultureInfo.CurrentCulture;
string dayName = date.ToString("dddd", culture);
string fullDate = date.ToString("f", culture);
string trim = string.Join(" ", fullDate.Replace(dayName, "").TrimStart(',').TrimStart(' ').Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries));
最后一行:
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
在公认答案的基础上,
GetAllDateTimePatterns
可以使用参数将结果限制为与标准格式字符串相关的模式,例如长日期模式的“D”
例如,GetAllDateTimePatterns('D')
当前正在为en-US返回以下内容:
"dddd, MMMM d, yyyy", "MMMM d, yyyy", "dddd, d MMMM, yyyy", "d MMMM, yyyy"
中弘香港有限公司:
"yyyy'年'M'月'd'日'", "yyyy'年'MM'月'dd'日'", "yyyy年MMMd日", "yyyy年MMMd日, dddd"
假设他们是按某种偏好或流行程度的顺序列出的,我们可以选择不包含星期几的第一个选项
以下是扩展方法,您可以简单地使用myDateTime.ToLongDateStringWithoutDayOfWeek()
和myDateTime.ToLongDateTimeStringWithoutDayOfWeek()
这是来自Reza的一个改进答案,它在某些本地化中不能正确工作
string formattedDate = DateTime.Now.ToLongDateString()
.Replace(DateTimeFormatInfo.CurrentInfo.GetDayName(DateTime.Now.DayOfWeek), "")
.TrimStart(", ".ToCharArray());
您可以将标准月/日模式(m)与自定义年(yyyy)连接起来: 示例: 2020年6月15日(英国-美国)
15朱尼,2020年(丹麦首都)
15 Juni,2020(id)要求错误的结果(一个包含星期几的字符串)并试图将其转换为可接受的形式(通过删除星期几)是一个非常糟糕的替代方法,而不是简单地要求一个格式正确的日期字符串。@Stephen:我同意。但是如何知道当前区域性的正确格式?年、月、日的顺序,分隔符等等@David-完全正确,你不能。如果重要的话,您必须研究每个区域性的适当格式,就像Microsoft对cultureInfo.DateTimeFormat.L所做的那样
"dddd, MMMM d, yyyy", "MMMM d, yyyy", "dddd, d MMMM, yyyy", "d MMMM, yyyy"
"yyyy'年'M'月'd'日'", "yyyy'年'MM'月'dd'日'", "yyyy年MMMd日", "yyyy年MMMd日, dddd"
public static string ToLongDateStringWithoutDayOfWeek(this DateTime d)
{
return d.ToString(
CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns('D')
.FirstOrDefault(a => !a.Contains("ddd") && !a.Contains("dddd"))
?? "D");
}
public static string ToLongDateTimeStringWithoutDayOfWeek(this DateTime d, bool includeSeconds = false)
{
char format = includeSeconds ? 'F' : 'f';
return d.ToString(
CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns(format)
.FirstOrDefault(a => !a.Contains("ddd") && !a.Contains("dddd"))
?? format.ToString());
}
string formattedDate = DateTime.Now.ToLongDateString()
.Replace(DateTimeFormatInfo.CurrentInfo.GetDayName(DateTime.Now.DayOfWeek), "")
.TrimStart(", ".ToCharArray());
string formattedDate = date.ToString("M") + ", " + date.ToString("yyyy");