2013-02-18 4 views
10

У меня есть две строки:Как объединить две строки (дата и время) к одному DateTime

string one = "13/02/09"; 
string two = "2:35:10 PM"; 

Я хочу, чтобы объединить эти два вместе и преобразовать в DateTime.

Я попытался следующие, но это не работает:

DateTime dt = Convert.ToDateTime(one + " " + two); 
DateTime dt1 = DateTime.ParseExact(one + " " + two, "dd/MM/yy HH:mm:ss tt", CultureInfo.InvariantCulture); 

Что я могу сделать, чтобы сделать эту работу?

+2

какое исключение выбрасывается? – tschmit007

+2

Рассмотрите возможность разбора даты и времени на объекты 'DateTime' отдельно и объедините компоненты. Разбор конкатенированных строк может привести к проблемам, если вы не слишком осторожны. –

ответ

8

Попробуйте, как это;

string one = "13/02/09"; 
string two = "2:35:10 PM"; 

DateTime dt = Convert.ToDateTime(one + " " + two); 
DateTime dt1 = DateTime.ParseExact(one + " " + two, "dd/MM/yy h:mm:ss tt", CultureInfo.InvariantCulture); 

Console.WriteLine(dt1); 

Вот DEMO.

HH с использованием 24-часовых часов от до 23. Например; 1:45:30 AM -> 01 и

h с использованием 12-часовых часов от 1 до 12. Например; 1:45:30 AM -> 1 и 1:45:30 PM -> 1

Заканчивать для получения дополнительной информации Custom Date and Time Format Strings

1

Проблема в том, что указанная вами строка формата неверна.

«HH» означает двузначный час, но у вас есть час с цифрой.

Используйте вместо этого «h».

Так полный формат «дд/мм/гггг ч: мм: сс тт»

+1

Когда вы укажете точную строку форматирования, и в ней нет текста (например, имени дня), предоставленная культура не имеет большого эффекта - я не уверен, что она имеет эффект _any_. – Rawling

+0

Хорошая точка. Благодаря! Я исправил ответ. –

1

использование DateTime.Parse() для разбора даты и времени отдельно. Затем добавьте временную составляющую второй к первой, например,

var date = DateTime.Parse (one); 
var time = DateTime.Parse (two); 
var result = date + time - time.Date; 
+0

Не работает ошибка получения: оператор «+» не может применяться к операндам типа «System.DateTime» и «System.DateTime». – MSTdev

3

Ваша проблема связана с вашим спецификатором часа; вы хотите h (час, с использованием 12-часового часа от 1 до 12), а не HH (час, с использованием 24-часового часа от 00 до 23).

2

Попробуйте использовать информацию культуры, которая соответствует формату DateTime для строковых значений:

DateTime dt = Convert.ToDateTime(one + " " + two, 
    CultureInfo.GetCultureInfo("ro-RO")); 

или изменять строку ввода, так что час имеет 2 цифры:

string one = "13/02/09"; 
string two = "02:35:10 PM"; 
DateTime dt1 = DateTime.ParseExact(one + " " + two, 
    "dd/MM/yy HH:mm:ss tt", 
    CultureInfo.InvariantCulture); 
+0

Он по-прежнему выдает исключение. –

+0

@MatthewWatson, ты уверен? Вы действительно протестировали его? –

+1

Извините, моя ошибка! Я попробовал, но я должен был вставить неправильный код! У меня есть +1;) –

0

Использование string two = "02:35:10 PM"; вместо string two = "2:35:10 PM";, а также hh вместо HH из-за формата AM/PM.

Ниже приведен код:

string one = "13/02/09"; 
string two = "02:35:10 PM"; 

DateTime dateTime = DateTime.ParseExact(one + " " + two, "dd/MM/yy hh:mm:ss tt", CultureInfo.InvariantCulture); 
+1

Я проверил его, и он работает. Просто скопируйте и вставьте код. –

+1

Для этого требуется, чтобы ОП контролировал свои входы, что может и не быть. Зачем требовать от него изменения входов, если это можно исправить, изменив строку формата _properly_? – Rawling

+0

Я удалил его, и действительно, я подтвердил ваш ответ! (У меня были проблемы с пальцами, на которые я отвечал на другой ответ, чем тот, на который я намеревался, я думаю, потому что мое подключение к интернету немного странно. Извините за путаницу.) –

0

Следующий код будет делать то, что вы хотите.Я использовал культуру Великобритании, чтобы заботиться о д/м/г структуры вашей даты:

 string string1 = "13/2/09"; 
     string string2 = "2:35:10 PM"; 
     DateTime combined = DateTime.Parse(string1 + ' ' + string2, new CultureInfo("UK")); 
0

Convert.ToDateTime использует DateTime.ParseExact с культурой вашего текущего потока, так что вы можете сделать вещи немного яснее просто делать:

string date = "13/02/09"; 
string time = "2:35:10 PM"; 
DateTime dateTime = DateTime.Parse(date +" "+ time, new CultureInfo("en-GB")); 
Console.WriteLine (dateTime); 

Это дает результат 13/02/2009 14:35:10 и заставляет использовать синтаксис для использования форматов даты в формате en-GB. Если ваша установка Windows является en-GB в любом случае, вам не нужен аргумент CultureInfo(..).

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