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

标签 c# webforms timespan time-format

使用 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)

因此解析日期工作正常,但时间跨度不行。一个例子:

输入日期: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”格式显示完整日期,并且可以正常工作。

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

最佳答案

将它们解析在一起

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

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”格式说明符。我猜上午/下午的概念与绝对时间点有关,而不是相对时间偏移,因此没有提供。但您仍然可以将文本框解析为 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

关于c# - 将 12 小时时间转换为时间跨度 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49179228/

相关文章:

c# - 静态构造函数和异常

javascript - 使用 Javascript 更改在按下回车键时激活哪个提交

asp.net-mvc - 如何在 .NET Web API 项目中存储全局每个请求数据

asp.net - 在什么情况下 ctl00 前缀会呈现为其他内容,例如。 ctl01?

vb.net - 如何使用 VB.NET 通过 UpDown 控件编辑时间跨度值?

c# - 适用于 Mac 的 Visual Studio : How to run tests with x64

c# - 数据结构中的杀毒算法

c# - 如何在不格式化的情况下返回TimeSpan?

c# - 跟踪同一应用程序的不同日志文件

c# - 如何实现时间跨度到字符串的转换?