将12小时时间转换为Timespan C#

时间:2018-03-08 17:38:13

标签: c# webforms timespan time-format

使用ASP.NET Forms,我遇到了将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并不适用。一个例子:

输入日期:08/03/2018

输入时间:凌晨3:00

获取的值已获得好转,但时间失败,因此DateResult变为" 08/03/2018 00:00"但不是" 08/03/2018 03:00"。我也尝试过使用TimeSpan.TryParse方法,但没有运气。

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

任何人请分享一些亮点?理想情况下,我想避免使用任何第三方插件。

2 个答案:

答案 0 :(得分:2)

将它们一起解析

最简单的方法是在解析为单个DateTime之前将字符串连接起来,例如

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

Ta da

如果你必须单独解析它们

如果您希望单独使用这些字段,您仍然可以(我猜您必须这样做,如果您希望时间格式准确但日期部分要灵活,如这是你的例子)。但是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

答案 1 :(得分:0)

请参阅ParseExact或https://msdn.microsoft.com/en-us/library/system.timespan.tryparseexact(v=vs.110).aspx对于TryParseExact应该同时适用于DateTime以及TimeSpan

Fyi它被称为子午线,另见AM/PM to TimeSpan