gpt4 book ai didi

c# - 在 C# 中编写等效的 IsDate()?

转载 作者:太空狗 更新时间:2023-10-29 20:45:48 26 4
gpt4 key购买 nike

如果之前有人问过这个问题,我深表歉意。我有一些数据需要存储为字符串,其中一些数据是日期。数据以字符串形式开始,例如“01/02/10”(英国格式)。现在,稍后会解析此数据,并且根据解析的内容,结果会有所不同(例如,2010 年 2 月 1 日与 10 年 1 月 2 日)。鉴于数据以字符串形式开始,在我存储它之前我想说,“如果这看起来像一个日期,请将其格式化为 dd-mmm-yy”

问题是很多东西看起来像 DateTime.Parse() 函数的日期。

因此,我应用了一些规则,只接受“合理”的日期格式进行支票,并编写了一个 IsDate() 函数。我正在寻求有关如何执行此操作的建议,因为虽然它有效,但我的解决方案似乎非常笨拙。

如果您曾经开始向它抛出随机字符串(例如“3/4”和“6.12”),那么我这样做而不是按照通常的 DateTime.TryParse 例程进行操作的全部原因就很清楚了。

这是我目前所拥有的:

class Program
{
static void Main(string[] args)
{
Debug.Assert(IsDate(6.12) == false);
Debug.Assert(IsDate("3/4") == false);
Debug.Assert(IsDate(010210) == false);
Debug.Assert(IsDate("010210") == false);
Debug.Assert(IsDate("12-jan-2000") == true);
Debug.Assert(IsDate("12-12-20") == true);
Debug.Assert(IsDate("1/1/34") == true);
Debug.Assert(IsDate("09/30/20") == false);
Debug.Assert(IsDate(DateTime.Now) == true);
}

static Boolean IsDate(Object value)
{
DateTimeFormatInfo DateTimeFormatGB = new CultureInfo("en-GB").DateTimeFormat; // new CultureInfo("en-US").DateTimeFormat;
return IsDate(value, DateTimeFormatGB);
}

static private List<String> AcceptableDateFormats = new List<String>(72);
static Boolean IsDate(Object value, DateTimeFormatInfo formatInfo)
{
if (AcceptableDateFormats.Count == 0)
{
foreach (var dateFormat in new[] { "d", "dd" })
{
foreach (var monthFormat in new[] { "M", "MM", "MMM" })
{
foreach (var yearFormat in new[] { "yy", "yyyy" })
{
foreach (var separator in new[] { "-", "/" }) // formatInfo.DateSeparator ?
{
String shortDateFormat;
shortDateFormat = dateFormat + separator + monthFormat + separator + yearFormat;
AcceptableDateFormats.Add(shortDateFormat);
AcceptableDateFormats.Add(shortDateFormat + " " + "HH:mm"); // formatInfo.TimeSeparator
AcceptableDateFormats.Add(shortDateFormat + " " + "HH:mm:ss");
}
}
}
}
}

String sValue = value.ToString().Trim();
DateTime unused;

foreach (String format in AcceptableDateFormats)
{
if (DateTime.TryParseExact(sValue, format, formatInfo, DateTimeStyles.None, out unused) == true) return true;
}

return false;
}
}

我没有使用区域性信息中的日期/时间分隔符,因为我想同时接受“/”和“-”。我想我本可以使用时间,因为这不太可能改变(对我而言)。

最佳答案

你检查了吗DateTime.TryParse()的替代覆盖,它可以让您更好地控制它认为是约会的内容?

关于c# - 在 C# 中编写等效的 IsDate()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3942490/

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