C# 格式超过24小时

C# 格式超过24小时,c#,sql-server,asp.net-mvc,dataformat,C#,Sql Server,Asp.net Mvc,Dataformat,在我的数据库中,我存储了人们在一项任务上花费的时间,以分钟为单位。例如600分钟。 当我创建此任务时,我希望用户填写小时和分钟,例如: 30:20或30或1:20。 为了做到这一点,我做了以下几点 [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = @"{0:hh\:mm}")] public TimeSpan AllocatedTime { get; set; } public int AllocatedMinute

在我的数据库中,我存储了人们在一项任务上花费的时间,以分钟为单位。例如600分钟。 当我创建此任务时,我希望用户填写小时和分钟,例如: 30:20或30或1:20。 为了做到这一点,我做了以下几点

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = @"{0:hh\:mm}")]
public TimeSpan AllocatedTime { get; set; }

public int AllocatedMinutes { get; set; }
当用户在字段中输入信息时,他使用allocatedtime,该时间稍后在控制器中转换为分钟

但问题是,只要输入的时间超过23:59,就会出现格式错误的错误。
我尝试过几种方法来解决这个问题,但都没有成功,有人知道如何解决这个问题吗?

这不是对你问题的回答,而是对不同方法的建议。我认为你试图以
hh:mm
的形式获取持续时间会让用户感到困惑(如果我看到
327:15
,我会扬起眉毛-这不是一种自然的阅读时间的方式。当你谈论超过一两天的时间时,这也很麻烦

我建议使用不同的持续时间格式;
Xd Yh Zm
,其中
X
Y
Z
分别是天、小时和分钟。每个部分都可以是可选的,但这会让用户更容易输入所讨论的时间跨度,因为他们会输入自然时间单位

然后,您可以使用正则表达式尝试获取各个部分,并根据这些值构建实际的
TimeSpan

这个正则表达式可能是一个开始:

(?:(?<days>\d+)d\s)?\s*(?:(?<hours>\d+)h\s)?\s*(?:(?<minutes>\d+)m)?
(?:(?\d+)d\s)?\s*(?:(?\d+)h\s)?\s*(?:(?\d+)m)?

注意:我只测试了几分钟,所以它可能没有涵盖所有的可能性,但它应该是一个足够好的开始。

在尝试了一次又一次尝试之后……我终于找到了答案:

[RegularExpression(@"^[0-9][0-9]?[0-9]?(:[0-5][0-9])?$", ErrorMessage = "wrong")]

我(个人)发现您的timespan输入格式非常混乱,我不想使用它。我认为您最好使用不同的设置,而不是尝试解决此问题。只要我的2美分。我可以使用字符串代替timespan,但它需要接受hh:mm和hh:mm,hh可能类似于
30h 20m
,然后您可以通过读取持续时间的各个部分将其解析为实际的时间跨度。我认为这有点奇怪。因为例如,你必须在一项任务上工作60个小时。你不想把它放在2:08:00,这是没有意义的。它在数据库中以整数形式保存在分钟内。@Vincendeg不,你根本不会使用
作为分隔符所有-这正是让我觉得你的方法令人困惑的地方-它看起来像是一个持续时间的瞬间。我用
d
数天,
h
数小时,
m
数分钟,用简单的空格作为分隔符。你的例子是
2d 8h
,很容易阅读/键入,也很容易解析成实际的de>TimeSpan@vincentdeg有多种系统使用这种输入格式(例如,Jira)它工作得很好。它不必在时间跨度内解析它,它必须在分钟内解析它,整数。@vincentdeg您可以在时间跨度内解析它,然后从
TotalMinutes
属性中读取值。它将是一个双精度,因为它在十进制中包含秒部分,但您可以将它转换为int来截断它。很好的至少你已经弄明白了,但我同意xxbbcc的说法,因为你的格式令人困惑。900:25对于一个人来说很难转换成有意义的时间间隔。@ErocGtx2问题是你不能在一个任务上工作超过50个小时。所以在这种情况下,键入2:2:00而不是50个小时是很奇怪的