将 12 小时时间转换为时间跨度 C#

Convert 12 hour time to Timespan C#

使用 ASP.NET 表单时,我遇到了将 12 小时时间转换为时间跨度的问题。下面我将 DateTime 与 TimeSpan 结合起来,因为用户选择一个日期,然后选择一个时间。这些字段由 javascript.

控制
DateTime DateResult = DateTime.TryParse(txtDate.Text, out DateResult) ? DateResult : DateTime.Today;
TimeSpan TimeResult = TimeSpan.TryParseExact(txtTime.Text, "h:mm tt", CultureInfo.InvariantCulture, out TimeResult) ? TimeResult : new TimeSpan();
DateResult = DateResult.Add(TimeResult)

所以解析日期工作正常,但 Timespan 不行。一个例子:

输入日期:2018 年 8 月 3 日

输入时间:3:00上午

值可以通过,但时间失败,因此 DateResult 变为“08/03/2018 00:00”而不是“08/03/2018 03:00”。我也尝试过使用 TimeSpan.TryParse 方法,但没有成功。

我还通过在后台手动输入数据库中的时间来确保格式正确。 gridview 有一列以这种格式 "dd/MM/yyyy h:mm tt" 显示完整日期,并且有效。

有人可以分享一些光吗?理想情况下,我想避免使用任何第三方插件。

请参阅 ParseExact 或 https://msdn.microsoft.com/en-us/library/system.timespan.tryparseexact(v=vs.110).aspx 了解 TryParseExact 应该适用于 DateTime 和 TimeSpan 等等

仅供参考,它被称为子午线,另请参阅 AM/PM to TimeSpan

一起解析它们

最简单的方法是在解析为单个日期时间之前连接字符串,例如

var dateEntered = @"08/03/2018";
var timeEntered = @"3:00 am";
DateTime result;
var completeDateString = dateEntered + " " + timeEntered;
var ok = DateTime.TryParse(completeDateString, out result);
if (!ok) result = DateTime.Today;
Console.WriteLine(result);

输出:

8/3/2018 3:00:00 AM

他哒

如果你必须单独解析它们

如果您想单独使用这些字段,您仍然可以(我想如果您希望时间格式准确但日期部分灵活,我想您必须这样做在你的例子中)。但是TimeSpan.TryParseExact和DateTime.Parse真的不一样。 format codes 不同;它不支持“:”字符(除了带有转义符的文字,例如 "\:"),或者 "tt" 格式说明符。我猜 am/pm 的概念与绝对时间点有关,而不是相对时间偏移量,因此未提供。但是您仍然可以将文本框解析为 DateTime 并使用其时间部分。

您可以稍微缩短一下,但此示例提供了您需要的一切:

static public DateTime ParseDateTime(string input)
{
    DateTime output;
    var ok = DateTime.TryParse(input, out output);
    if (ok) return output;
    return DateTime.Today;
}

static public TimeSpan ParseTime(string input)
{
    DateTime output;
    var ok = DateTime.TryParseExact(input, @"h:mm tt", CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.NoCurrentDateDefault, out output);
    return output.Subtract(output.Date);
}


public static void Main()
{
    var dateEntered = @"08/03/2018";
    var timeEntered = @"3:00 am";
    DateTime dateResult = ParseDateTime(dateEntered);
    TimeSpan timeResult = ParseTime(timeEntered);
    DateTime finalResult = dateResult.Add(timeResult);
    Console.WriteLine(finalResult);
}

输出:

8/3/2018 3:00:00 AM

Code on DotNetFiddle