DateTime.Parse的连字符?

时间:2013-11-28 12:59:07

标签: c# datetime

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数据:

enter image description here

2 个答案:

答案 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会尝试寻找各种格式,其中可能包括DdyTt以及由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