Я пытаюсь удалить часовой пояс из строки.
Строка выглядит так, как показано ниже.
2/05/2018 6:54:00 AM
Эти данные были получены из локальной базы данных.
Часть кода:
string datCommisioned = (rdr.GetValue(4).ToString());
string dateonly = datCommisioned.ToString("dd/MM/yyyy");
Когда я попытался выполнить приведенный выше код, он получил ошибку,
cannot convert from 'string' to 'System.IFormatProvider'
Есть идеи, как поймать дату без учета времени? Спасибо!
Обновлено: это, вероятно, не повторяющийся вопрос, поскольку я ссылаюсь на другие вопросы перед публикацией. Контекст этого вопроса отличается, потому что строка, которую я извлекаю, не распознается как действительный DateTime (вводится вручную пользователями), поэтому класс DateTime использовать нельзя.
Возможный дубликат Чтение даты с помощью DataReader
Смотри сюда stackoverflow.com/questions/5619216/…
Вам просто нужно изменить его на это.
var datCommisioned = DateTime.parse(rdr.GetValue(4)).ToString("dd/MM/yyyy");
В настоящее время вы конвертируете его в строку, а затем пытаетесь ToString () String, когда вам просто нужно toString () дату из читателя.
Как узнать, что GetValue
возвращает DateTime
?
Да просто понял, что нет. Нужно отредактировать его, чтобы разобрать.
Есть несколько подходов
Используйте объект DateTime
.
DateTime dateTime = DateTime.Parse(datCommissioned);
string dateonly = dateTime.ToString("dd/MM/yyyy");
Разделить на пробелы
var split = datCommissioned.Split(' ');
string dateonly = split[0];
Я бы не стал предлагать синтаксический анализ, если вы можете получить DateTime прямо из DataReader.
@CamiloTerevinto нигде не заявляет, что он использует DataReader
, хотя по сокращению я понимаю, почему это предполагается.
Да, как сказал Камило, я использую объект чтения данных для чтения данных из локальной базы данных. Эти данные были вставлены пользователями вручную. Когда я использую класс DateTime, есть исключение. System.FormatException: «Строка не была распознана как допустимый DateTime». Я понимаю, что причина этой проблемы в том, что данные были введены пользователями вручную. @Тим
@mattdaemon - много способов обойти это. Поместите try
вокруг Parse
или как-нибудь проверьте правильность данных перед анализом. Если он сохраняется / извлекается как строка, другой ответ здесь не сработает.
//Assuming value at index 4 is a DateTime.
string datCommisioned = rdr.GetDateTime(4).ToString(@"dd/MM/yyyy");
Хорошая практика - использовать более конкретные и строго типизированные методы с DataReader. Помогает быстрее выявлять ошибки.
почему знак "@"?
@ pm100 stackoverflow.com/questions/3311988/…
@ pm100, чтобы избежать экранирования ('\'), если они будут добавлены. Моя привычка, но в этом примере она не обязательна. Инстинктивно я избегаю экранирования в строках формата.
Просто другой подход здесь; Вы можете использовать DateTime.Parse () или, возможно, более безопасную альтернативу DateTime.TryParse (), чтобы преобразовать строку в объект DateTime. Затем используйте свойство Date объекта DateTime, чтобы установить время в полночь, т.е. 00:00:00. В зависимости от того, для чего вы используете дату, может оказаться полезным использование объекта DateTime вместо строки. Затем вы можете вызвать ToString («d») или использовать другое средство форматирования, чтобы получить часть только даты в желаемом формате.
if (TryParse(datCommissioned, out DateTime commissionedDate))
{
commisionedDate = commisionedDate.Date;
string commissionedDateText = commissionedDate.ToString(“dd/MM/yyyy”);
}
datCommisioned
- это строка, и вы снова пытаетесь преобразовать ее в строку. String.ToString () принимает IFormatProvider.