gpt4 book ai didi

c# - DateTime.TryParse 可以(明确)识别哪些格式?

转载 作者:行者123 更新时间:2023-12-02 07:33:20 39 4
gpt4 key购买 nike

我指的是 DateTime.TryParse(string s, out DateTime result) 重载,它尝试从字符串中解析 DateTime - 没有特定的格式正在指定。

我可以从http://msdn.microsoft.com/en-us/library/ch92fbc1(v=vs.110).aspx看到该方法使用 DateTimeFormatInfo(从控制面板设置派生),并且不需要时间等。

但是,我如何知道它当前和/或将来是否会识别例如以下内容?

  • 2014 年 5 月 13 日
  • 2014 年 5 月 13 日
  • 2014年5月13日
  • 2014年5月13日
  • 2014 年 5 月 13 日

(不是详尽的列表,只是一些示例)

我已经查看了该方法的源代码,但通过逆向工程从核心 .NET 方法中找出预期结果似乎并不正确。

我可以从文档中看到,“...因为 DateTime.TryParse(String, DateTime) 方法尝试使用当前区域性的格式规则来解析日期和时间的字符串表示形式... “ - MSDN 中是否有其他地方列出了有效的潜在表示,或者哪个类定义了它们

最佳答案

From the MSDN documentation for DateTime.Parse :

The string to be parsed can take any of the following forms:

  • A string with a date and a time component.

  • A string with a date but no time component. If the time component is absent, the method assumes 12:00 midnight. If the date component has a two-digit year, it is converted to a year based on the Calendar.TwoDigitYearMax of the current culture's current calendar or the specified culture's current calendar (if you use an overload with a non-null provider argument).

  • A string with a time but no date component. The method assumes the current date unless you call the Parse(String, IFormatProvider, DateTimeStyles) overload and include DateTimeStyles.NoCurrentDateDefault in the styles parameter, in which case the method assumes January 1, 0001.

  • A string that includes time zone information and conforms to ISO 8601. In the following examples, the first string designates Coordinated Universal Time (UTC), and the second string designates the time in a time zone that's seven hours earlier than UTC:

    2008-11-01T19:35:00.0000000Z 
    2008-11-01T19:35:00.0000000-07:00
  • A string that includes the GMT designator and conforms to the RFC 1123 time format; for example:

    Sat, 01 Nov 2008 19:35:00 GMT
  • A string that includes the date and time along with time zone offset information; for example:

    03/01/2009 05:42:00 -5:00

虽然这些文档是为 Parse 编写的,但它们也适用于 TryParse。由于 DateTime.Parse 的文档有更多详细信息,您可能会认为 Parse 是主要方法,而 TryParse 是解析的包装器 - 但实际上,反之亦然Parse 包装 TryParse 并在接收到 false 时抛出异常。 Source here .

当这些文档引用“日期组件”或“时间组件”时,它们专门讨论传递给 IFormatProvider 的 DateTimeFormatInfo 对象提供的格式之一 参数 - 或从传递的 CultureInfo 派生的参数,如果未提供,则从 CurrentCulture 派生。

如果您想了解特定 DateTimeFormatInfo 对象的所有格式,则可以使用 DateTimeFormatInfo.GetAllDateTimePatterns 。例如:

string[] p = CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns();

作为具体示例,请考虑:

var dtfi = CultureInfo.CreateSpecificCulture("en-GB").DateTimeFormat;
foreach (string pattern in dtfi.GetAllDateTimePatterns())
{
Debug.WriteLine(pattern);
}

输出如下:

dd/MM/yyyy
dd/MM/yy
d/M/yy
d.M.yy
yyyy-MM-dd
dd MMMM yyyy
d MMMM yyyy
dddd, d MMMM yyyy
dddd, dd MMMM yyyy
dd MMMM yyyy HH:mm
dd MMMM yyyy H:mm
dd MMMM yyyy hh:mm tt
dd MMMM yyyy h:mm tt
d MMMM yyyy HH:mm
d MMMM yyyy H:mm
d MMMM yyyy hh:mm tt
d MMMM yyyy h:mm tt
dddd, d MMMM yyyy HH:mm
dddd, d MMMM yyyy H:mm
dddd, d MMMM yyyy hh:mm tt
dddd, d MMMM yyyy h:mm tt
dddd, dd MMMM yyyy HH:mm
dddd, dd MMMM yyyy H:mm
dddd, dd MMMM yyyy hh:mm tt
dddd, dd MMMM yyyy h:mm tt
dd MMMM yyyy HH:mm:ss
dd MMMM yyyy H:mm:ss
dd MMMM yyyy hh:mm:ss tt
dd MMMM yyyy h:mm:ss tt
d MMMM yyyy HH:mm:ss
d MMMM yyyy H:mm:ss
d MMMM yyyy hh:mm:ss tt
d MMMM yyyy h:mm:ss tt
dddd, d MMMM yyyy HH:mm:ss
dddd, d MMMM yyyy H:mm:ss
dddd, d MMMM yyyy hh:mm:ss tt
dddd, d MMMM yyyy h:mm:ss tt
dddd, dd MMMM yyyy HH:mm:ss
dddd, dd MMMM yyyy H:mm:ss
dddd, dd MMMM yyyy hh:mm:ss tt
dddd, dd MMMM yyyy h:mm:ss tt
dd/MM/yyyy HH:mm
dd/MM/yyyy H:mm
dd/MM/yyyy hh:mm tt
dd/MM/yyyy h:mm tt
dd/MM/yy HH:mm
dd/MM/yy H:mm
dd/MM/yy hh:mm tt
dd/MM/yy h:mm tt
d/M/yy HH:mm
d/M/yy H:mm
d/M/yy hh:mm tt
d/M/yy h:mm tt
d.M.yy HH:mm
d.M.yy H:mm
d.M.yy hh:mm tt
d.M.yy h:mm tt
yyyy-MM-dd HH:mm
yyyy-MM-dd H:mm
yyyy-MM-dd hh:mm tt
yyyy-MM-dd h:mm tt
dd/MM/yyyy HH:mm:ss
dd/MM/yyyy H:mm:ss
dd/MM/yyyy hh:mm:ss tt
dd/MM/yyyy h:mm:ss tt
dd/MM/yy HH:mm:ss
dd/MM/yy H:mm:ss
dd/MM/yy hh:mm:ss tt
dd/MM/yy h:mm:ss tt
d/M/yy HH:mm:ss
d/M/yy H:mm:ss
d/M/yy hh:mm:ss tt
d/M/yy h:mm:ss tt
d.M.yy HH:mm:ss
d.M.yy H:mm:ss
d.M.yy hh:mm:ss tt
d.M.yy h:mm:ss tt
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd H:mm:ss
yyyy-MM-dd hh:mm:ss tt
yyyy-MM-dd h:mm:ss tt
d MMMM
d MMMM
yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK
yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK
ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
yyyy'-'MM'-'dd'T'HH':'mm':'ss
HH:mm
H:mm
hh:mm tt
h:mm tt
HH:mm:ss
H:mm:ss
hh:mm:ss tt
h:mm:ss tt
yyyy'-'MM'-'dd HH':'mm':'ss'Z'
dd MMMM yyyy HH:mm:ss
dd MMMM yyyy H:mm:ss
dd MMMM yyyy hh:mm:ss tt
dd MMMM yyyy h:mm:ss tt
d MMMM yyyy HH:mm:ss
d MMMM yyyy H:mm:ss
d MMMM yyyy hh:mm:ss tt
d MMMM yyyy h:mm:ss tt
dddd, d MMMM yyyy HH:mm:ss
dddd, d MMMM yyyy H:mm:ss
dddd, d MMMM yyyy hh:mm:ss tt
dddd, d MMMM yyyy h:mm:ss tt
dddd, dd MMMM yyyy HH:mm:ss
dddd, dd MMMM yyyy H:mm:ss
dddd, dd MMMM yyyy hh:mm:ss tt
dddd, dd MMMM yyyy h:mm:ss tt
MMMM yyyy
MMMM yyyy

理想情况下,使用 DateTime.ParseDateTime.TryParse 时,从此方法返回的任何格式模式中的任何字符串都将被视为有效。

但是 - 正如 Blam 在评论中指出的那样,并非每种可能的格式都能正确解析。问题很简单,并非所有格式都可以对每个值进行往返。例如,en-US 区域性具有 MM/dd/yyyy/MM/dd 格式。如果我解析 14/05/01,您会认为它会将 14 识别为一年,因为它太大而不能作为一个月,并使用 yy/MM/dd > 格式。但实际上,它会看到三个由斜杠分隔的两位数字,因此会选择第一个匹配的条目,即 MM/dd/yy。然后,由于 14 不适合 MM,因此解析失败,并且 TryParse 返回 false。

关于c# - DateTime.TryParse 可以(明确)识别哪些格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23409680/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com