var d=DateTime.Parse("03-02-2013");
Console.Write(d.Month); //2
1)Dateime.parse
如何知道:
-
是分隔符? -
不是标准分隔符(http://msdn.microsoft.com/en-us/library/az4se3k1.aspx)
2)它如何知道月份是2
而不是3
?是区域设置吗? (我更改了我的区域设置并且没有更改)...我尝试找到MSDN的参考但找不到。
这是我的DateTimeFormatInfo.CurrentInfo数据:
答案 0 :(得分:2)
DateTime.Parse
而不是DateTime.ParseExact
尝试尽最大努力解析您的约会。这意味着它允许使用多个不同的日期分隔符,包括/
,-
,.
和(空格)。但是,日期组成部分的顺序仍然来自
DateTimeFormatInfo.CurrentInfo
,在您的情况下dd/MM/yyyy
意味着该日出现在该月之前。
因此,您的希伯来文化DateTime.Parse("03-02-2013")
将于2013年2月3日返回,而调用DateTime.Parse("03-02-2013", CultureInfo.InvariantCulture)
将于2013年3月2日返回,因为不变文化基于en-US
文化,该文化具有前一个月的日期
DateTime.Parse
行为的确切行为有点难以理解,因此以下信息可能不完全准确。我相信DateTime.Parse
会尝试寻找各种格式,其中可能包括D
,d
,y
,T
,t
以及由DateTimeFormat.MonthDayPattern
定义的模式。给定DateTimeFormatInfo
,您可以使用此代码获取所有模式:
new[] { 'D', 'd', 'y', 'T', 't' }
.SelectMany(p => dateTimeFormatInfo.GetAllDateTimePatterns(p))
.Concat(new[] { dateTimeFormatInfo.MonthDayPattern })
对于希伯来文化,我得到以下列表:
dddd dd MMMM yyyy dd MMMM yyyy dddd dd 'ב'MMMM yyyy ddd dd 'ב'MMMM yyyy dd 'ב'MMMM yyyy dd/MM/yyyy dd MMMM yyyy dd/MM/yy dd/MMMM/yyyy dd-MM-yy dd-MM-yyyy dd-MMMM-yyyy yyyy-MM-dd dd 'ב'MMMM yyyy dd MMM yy MMMM yyyy HH:mm:ss hh:mm:ss tt HH:mm hh:mm tt dd MMMM
此列表包含dd-MM-yyyy
,但同样,此列表可能不完全准确。
答案 1 :(得分:1)
DateTime.Parse
基于当前的文化。这是如何在.NET中发挥作用的;
public static DateTime Parse(string s)
{
return DateTimeParse.Parse(s, DateTimeFormatInfo.CurrentInfo, DateTimeStyles.None);
}
我认为您当前的文化日期分隔符-
就是它正常运作的原因。
来自DateTimeFormatInfo.CurrentInfo
获取基于格式化值的只读
DateTimeFormatInfo
对象 关于当前文化。
编辑:哦,我会更深入地研究这个主题。正如我在互联网上发现的那样,DateTime.Parse
支持很多格式。例如;
Standart Time "1/1/2000"
HTTP Header "Fri, 27 Feb 2009 03:11:21 GMT";
w3.org "2009/02/26 18:37:58";
nytimes "Thursday, February 26, 2009"
Standart Time "February 26, 2009";
ISO Standard 8601 for Dates "2002-02-10";
Windows file system Created/Modified "2/21/2009 10:35 PM";
Windows Date and Time panel "8:04:00 PM";
它如何知道月份是2而不是3?
这完全取决于您的文化。使用InvariantCulture
,它会返回3
,因为标准的日期时间格式,它会在您的文化中返回2
。