使用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",并且有效。
任何人请分享一些亮点?理想情况下,我想避免使用任何第三方插件。
答案 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
答案 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