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