gpt4 book ai didi

c# - 解析时间、日期/时间或日期

转载 作者:太空狗 更新时间:2023-10-29 23:15:11 25 4
gpt4 key购买 nike

我想解析包含时间、日期和时间或仅包含日期的输入字符串,我需要知道输入字符串中包含哪些部分。

解析实际值不是问题:

var dt1 = DateTime.Parse("10:00:00", CultureInfo.CurrentCulture);
var dt2 = DateTime.Parse("10pm", CultureInfo.CurrentCulture);
var dt3 = DateTime.Parse("01/02/2014", CultureInfo.CurrentCulture);
var dt4 = DateTime.Parse("01/02/2014 10:00:00", CultureInfo.CurrentCulture);

这些都按照您的预期成功解析。

但是,如果未提供日期元素,DateTime.Parse 会自动将当前日期添加到时间中。因此,如果今天是 2014 年 1 月 1 日,那么 DateTime.Parse("10pm") 实际上会返回一个设置为 1/1/2014 10:00:00 的 DateTime 对象。

此外,如果我解析没有时间元素的输入字符串,则 DateTime.Parse 假定时间为 00:00:00。

因此在解析发生后,仅通过检查生成的 DateTime 对象,我无法确定原始输入字符串是指定了日期和时间,还是仅指定了日期或仅指定了时间。

我可以使用简单的 RegEx 来查找标准时间模式,例如^\d\d:\d\d$ 但我不想假设所有文化都使用相同的模式来指定时间。

我如何能够可靠地检测原始输入字符串中提供了哪些日期和时间元素而不考虑文化,并且不使用可能只适用于某些文化的模糊正则表达式?

最佳答案

您可以将 DateTime.ParseDateTimeStyles.NoCurrentDateDefault 一起使用,这会阻止您获取当前日期:

CultureInfo culture = CultureInfo.InvariantCulture;

var dt1 = DateTime.Parse("10:00:00", culture, DateTimeStyles.NoCurrentDateDefault);
var dt2 = DateTime.Parse("10pm", culture, DateTimeStyles.NoCurrentDateDefault);
var dt3 = DateTime.Parse("01/02/2014", culture, DateTimeStyles.NoCurrentDateDefault);
var dt4 = DateTime.Parse("01/02/2014 10:00:00", culture, DateTimeStyles.NoCurrentDateDefault);
// problem, is this a date only or a date+time?
var dt5 = DateTime.Parse("01/02/2014 00:00:00", culture, DateTimeStyles.NoCurrentDateDefault);

现在年份是 1。这样你至少可以只识别时间。您仍然无法区分没有时间的日期和午夜日期时间。

所以这可能就足够了:

bool dt1TimeOnly, dt1DateOnly, dt1DateAndTime;
dt1TimeOnly = dt1.Year == 1;
dt1DateOnly = !dt1TimeOnly && dt1.TimeOfDay == TimeSpan.FromHours(0);
dt1DateAndTime = !dt1TimeOnly && !dt1DateOnly;

因此,准确识别输入的唯一方法是提供所有支持的格式并在每个格式上使用 DateTime.TryParseExact

例如这个枚举:

public enum DateTimeType
{
Date,
Time,
DateTime,
Unknown
}

和这个方法:

public DateTimeType GetDateTimeType(string input, CultureInfo culture, out DateTime parsedDate)
{
if(culture == null) culture = CultureInfo.CurrentCulture;
var supportedFormats = new[] {
new{ Pattern = culture.DateTimeFormat.ShortDatePattern, Type = DateTimeType.Date },
new{ Pattern = culture.DateTimeFormat.ShortTimePattern, Type = DateTimeType.Time },
new{ Pattern = culture.DateTimeFormat.LongDatePattern, Type = DateTimeType.Date },
new{ Pattern = culture.DateTimeFormat.LongTimePattern, Type = DateTimeType.Time },
new{ Pattern = "hhtt", Type = DateTimeType.Time},
new{
Pattern = culture.DateTimeFormat.ShortDatePattern + " " + culture.DateTimeFormat.LongTimePattern,
Type = DateTimeType.DateTime
}
};

foreach(var fi in supportedFormats)
{
DateTime dt;
if (DateTime.TryParseExact(input, fi.Pattern, culture, DateTimeStyles.NoCurrentDateDefault, out dt))
{
parsedDate = dt;
return fi.Type;
}
}
parsedDate = default(DateTime);
return DateTimeType.Unknown;
}

现在这会产生正确的日期和 DateTimeTypes:

DateTime dt1;
DateTimeType type1 = GetDateTimeType("10:00:00", culture, out dt1);
DateTime dt2;
DateTimeType type2 = GetDateTimeType("10pm", culture, out dt2);
DateTime dt3;
DateTimeType type3 = GetDateTimeType("01/02/2014", culture, out dt3);
DateTime dt4;
DateTimeType type4 = GetDateTimeType("01/02/2014 10:00:00", culture, out dt4);
DateTime dt5;
DateTimeType type5 = GetDateTimeType("01/02/2014 00:00:00", culture, out dt5);

关于c# - 解析时间、日期/时间或日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21047213/

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