Мне нужно преобразовать TimeSpan
в строку с форматом hh:mm tt
.
Timespan? tTime;
Console.WriteLine(tTime.ToString("hh:mm tt"));
ToString("hh:mm tt")
работает хорошо, если значение не равно null, но вызывает ошибку, когда значение равно null.
Есть ли какие-либо решения?
Просто используйте оператор if или сокращенный? выражение. Заполните желаемый результат : ""
когда значение равно нулю
Console.WriteLine(tTime.HasValue ? tTime.Value.ToString("hh:mm tt") : "");
Причина, по которой вы получаете ошибку, состоит в том, что tTime.ToString("hh:mm tt")
пытается принудительно преобразовать ее значение в строку с требуемым форматом.
Если это значение равно NULL, для преобразования не существует способа для его обработки, тем самым вызывая ошибку.
Один из способов сделать это - ответить на @KevinCloet, где он просто проверяет, имеет ли значение tTime
значение и преобразует его, если это так.
// validation ? if true : if false
Console.WriteLine(tTime.HasValue ? tTime.Value.ToString("hh:mm tt") : String.Empty);
который также может быть записан как:
// Boolean values don't need = true
if(tTime.HasValue){
Console.WriteLine(tTime.Value.ToString("hh:mm tt"));
}else{
Console.WriteLine(String.Empty);
}
Другой способ сделать это - использовать метод try{}catch(){}
, который почти такой же, как и оператор extended if
try{
Console.WriteLine(tTime.Value.ToString("hh:mm tt"));
}
catch(Exception e){
// You don't actually need the 'Exception e',
// however 'e.Message' will tell you exactly what went wrong
Console.WriteLine(String.Empty);
}
Надеюсь, это объяснение поможет вам понять, а не просто дать вам ответ.
Редактировать:
Основываясь на ответе Джона Скетса на тему "" против String.Empty, вы можете по существу использовать и то, и другое.
String.Empty
вместо ""
Попробуйте следующий код:
string time = spantime.HasValue ? spantime.Value.ToString("hh':'mm':'ss") : "??:??:??";
Сначала нужно проверить значение, используя HasValue
, или сравнением с нулем.
Однако вам также необходимо использовать допустимую строку формата времени. "hh:mm tt"
действует на DateTime
, но не на TimeSpan
. Попробуй это:
string s = tTime.HasValue ? tTime.Value.ToString("hh\\:mm") : "";