2013-08-20 2 views
2

У меня есть одно текстовое поле, в которое пользователь вводит количество часов. В настоящее время, если они вводят 26 часов, мы получаем ошибку из-за предела HH TimeSpan. Это значение будет храниться в поле SQL Server 2008 Time (7).Расчет дней с часов TimeSpan

Как я могу узнать, что он распознал более 23 часов? Невозможно сохранить его как десятичное, потому что другой раздел программы требует, чтобы это поле было полем времени (7).

TimeSpan estiamtedHours; 

private void btnSave_Click(object sender, EventArgs e) 
{ 
    estimatedHours = TimeSpan.Parse(tbEstHours.Text); 
} 

поле Время (7) также имеет предел в 24 часов, что бы быть лучший способ обойти это, как время (7) требуется для Секундомер на другой форме.

Благодаря

+0

Ну это '26' допустимое значение? вы должны проанализировать его как int, а затем проверить, больше ли он 23 или нет. Угадайте, что значение не будет сохранено в базе данных, если его более 24 часов – V4Vendetta

ответ

1

Будьте осторожны. TimeSpan предназначен для измерения истекшей продолжительности времени, в то время как time в SQL Server - это именно время суток. Это две разные концепции.

Иногда это путается. Например, DateTime.TimeOfDay - это тип TimeSpan - что противоречит его дизайну. Это разумный компромисс, поскольку нет Time типа .Net, и он может подходит.

Но TimeSpan, который составляет 24 часа и более, будет не вставляется в SQL-сервер time.

Кроме того, TimeSpan основан на стандартных днях. Вы можете создать его с TimeSpan.FromHours(26), и он будет представлять «1 день и 2 часа». Если вы позвоните TimeSpan.FromHours(26).ToString(), это будет "1.02:00:00".

Если вы сохраняете истекшую продолжительность времени (а не время суток), используйте TimeSpan в .Net, но используйте целочисленный тип в SQL Server. Определите, для каких единиц вам нужна точность, и это поможет вам выбрать тип данных.

Например, вы можете сохранить полную точность TimeSpan.Ticks с использованием типа SQL Server bigint. Но, вероятно, вы будете хранить TimeSpan.TotalSeconds, используя int. При загрузке вы можете использовать TimeSpan.FromSeconds, чтобы вернуться к типу TimeSpan.

Также имейте в виду, что TimeSpan может быть отрицательным, который представляет собой перемещение назад во времени.

Кстати, если вы использовали библиотеку Noda Time - эти концепции будут разделены для вас в типах Duration и LocalTime.

Если то, что вы были после того, как способ разобрать строку как "26:00:00" вы не может сделать это с TimeSpan. Но вы можете использовать Noda Time:

// starting from this string 
string s = "26:00:00"; 

// Parse as a Duration using the Noda Time Pattern API 
DurationPattern pattern = DurationPattern.CreateWithInvariantCulture("H:mm:ss"); 
Duration d = pattern.Parse(s).Value; 
Debug.WriteLine(pattern.Format(d)); // 26:00:00 

// if you want a TimeSpan, you can still get one. 
TimeSpan ts = d.ToTimeSpan(); 
Debug.WriteLine(ts); // 1.02:00:00 
3

Разбираем текст в int и передать int как параметр hours в конструктор TimeSpan.

int hours; 
if (Int32.TryParse(tbEstHours.Text, out hours)) 
{ 
    TimeSpan ts = new TimeSpan(hours, 0, 0); 
} 

Вы также можете сделать то же самое с помощью минут и секунд. В качестве альтернативы, если вам просто нужны часы, вы можете использовать TimeSpan.FromHours таким же образом, а не для конструктора TimeSpan.

+0

Я использовал бы это, поскольку он защищает от ошибок ввода пользователя в середине вашей программы. т. Е. 2a6, если вы просто разбираете это, это исключение. , но используйте Double.TryParse для лучшей точности. – f1wade

+0

Даже если это работает, я предполагаю, что поле времени ожидает длительность и провалится более 24 часов. Пожалуйста, исправьте меня, если я ошибаюсь – V4Vendetta

+0

@ V4Vendetta - Возможно, я вас не понимаю, но он должен вернуть 26 часов, если вы используете свойство «TotalHours» (в отличие от «Часов», которые возвращают 2, когда он будет циклически крутиться). – keyboardP

4

Если вы знаете значение входного часа значение как число с плавающей точкой, вы можете использовать TimeSpan.FromHours():

TimeSpan estiamtedHours; 

private void btnSave_Click(object sender, EventArgs e) 
{ 
    estimatedHours = TimeSpan.FromHours(Double.Parse(tbEstHours.Text)); 
} 
+0

вы должны преобразовать строку в int/double – x4rf41

+0

это вызовет исключение –

+0

Ops, Обновлено с помощью синтаксического анализа. Это, конечно, все еще нуждается в проверке и обработке ошибок, но также оригинал (обращение с недопустимым/отрицательным/и т. Д.) –

1

После разбора ввода, используйте FromHours метод:

double hours 
if (double.TryParse(tbEstHours.Text, out hours) 
{ 
    TimeSpan time = TimeSpan.FromHours(hours); 
} 
+0

обратно в стек –

+0

@DarrenDavies Haha aye. Похоже, вы никогда не покидали помощника;) – mattytommo

1

TimeSpan.Parse Method ожидает ввода в формате

[ws] [-] {d | [Д.] Чч: мм [: сс [Л']]} [WS]

где чч является часовую часть, в пределах от 0 до 23.

Например,

  • TimeSpan.Parse("5") возвращает 5 дней,
  • TimeSpan.Parse("5:14") возвращает 5 часов и 14 минут.

Если вы просто хотите, чтобы пользователи ввести количество часов, вы можете просто разобрать вход как целые и построить TimeSpan от этого: (. Использование int.TryParse для ввода данных пользователя)

TimeSpan result = TimeSpan.FromHours(int.Parse("26")); 
// result == {1.02:00:00} 

Если вы хотите, чтобы ваши пользователи вводили часы и минуты (например, 26:14), вам необходимо реализовать какой-либо метод парсинга самостоятельно.

1

Поскольку другие ответы не решить эту

концерна здесь является столбцом время в базе данных, и он ожидает, что действительный срок, который будет limited to the 24 hr время, когда, как TimeSpan может иметь их за пределы 24 ч.

Таким образом, вы должны в идеале разобрать значение как межд (использование int.Parse или int.TryParse), а затем проверить, если она меньше 24, а затем создать соответствующий TimeSpan

+0

Да, это беспокойство, которое я не рассматривал. int.Parse не будет работать, если указано 3.30. Время (7) требуется, так как другая форма использует секундомер для подсчета этого значения. – dynamicuser

Смежные вопросы