【问题标题】:Convert 12 hour time to Timespan C#将 12 小时时间转换为时间跨度 C#
【发布时间】:2018-08-17 04:01:11
【问题描述】:

使用 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 不能。一个例子:

输入日期:08/03/2018

输入时间:凌晨 3:00

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

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

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

【问题讨论】:

标签: c# webforms timespan time-format


【解决方案1】:

一起解析它们

最简单的事情是在解析为单个 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

塔达

如果你必须单独解析它们

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

【讨论】:

  • 谢谢。使用 DateTime 解析时间似乎比时间跨度更可靠。将它们一起做也很有意义,因为这将进入 1 个数据库字段。认为它们必须单独解析/验证。
【解决方案2】:

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

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

【讨论】:

  • 不幸的是,早些时候尝试过使用“h:mm tt”和“hh:mm tt”之类的东西,但仍然令人惊讶地失败了,而且很烦人:/
猜你喜欢
  • 2012-04-09
  • 2013-10-14
  • 1970-01-01
  • 2012-12-01
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
相关资源
最近更新 更多