2012-02-09 1 views
1

Я испытываю странное поведение при преобразовании String в DateTime, а затем снова ToString().Странное поведение при преобразовании String в DateTime

Convert.ToDateTime("16-02-2012").ToString("MM/dd/yyyy") приводит 02-16-2012 Convert.ToDateTime("16-02-2012").ToLongDateString() результатов в 16. Февраль 2012

Как вы можете видеть преобразование является правильным при использовании ToLongDateString(), но как-то/преобразуется в - когда используя ToString().

Когда я вставить первый результат в виде листа Excel значение фактически '02 -16-2012 (обратите внимание на "в начале)

Когда я использую дату, когда первый сегмент ниже, чем 12 результат содержит/как ожидалось, но возвращается к dd/MM/yyyy.

Я попытался использовать new System.Globalization.CultureInfo("da-DK", false) при преобразовании ToDateTime(), но без эффекта (наша система уже установлена ​​на da-DK - но я отчаялся).

Кто-нибудь видел это поведение раньше?

EDIT

Чтобы прояснить мой пост немного, формат даты в датском дд-мм-гггг (который я хочу, чтобы отформатировать в мм/дд/гггг) - Я знаю, что первый сегмент месяц на английском языке.

+1

@ vc74 - Очевидно, что в контексте вопроса 16 это день не месяц. Почему 6 человек подняли этот комментарий, нет никакого смысла, ясно, в регионе, в котором находится Марл, они используют соглашение DD/MM/YYYY. –

+0

@ Marle1 - Вы понимаете, что код ведет себя точно так, как это правильно? –

+0

@ Marle1 Причина, по которой это не работает, заключается в том, что культура Дании использует дефис в качестве разделителя дат и использует строки/в качестве заполнителя для разделителя дат. –

ответ

1

Чтобы экспортировать данные в формате, который вы хотите, вы можете вставить данные в DateTime и использовать формат ячейку, как в следующем примере (при условии, ваши даты в колонке А):

Application Excel = new Application(); 

Workbook workbook = Excel.Workbooks.Add(1); 
Worksheet sheet = workbook.Sheets[1]; 
sheet.Cells[1, 1] = DateTime.Now; 
sheet.Cells[2, 1] = DateTime.Now.AddDays(1); 
sheet.Cells[3, 1] = DateTime.Now.AddDays(2); 
sheet.UsedRange.Columns["A:A", Type.Missing].NumberFormat = "MM/dd/yyyy"; 
workbook.Sheets.Add(sheet); 

// Save the workbook or make it visible 
+0

Ваш код производит: 'System.FormatException: String не был признан допустимым DateTime.' FYI, разделитель действительно не имеет значения:' Console.WriteLine (DateTime.Now.ToString («MM/dd/yyyy»)) ; ' ** 02/09/2012 ** ' Console.WriteLine (DateTime.Now.ToString («MM-dd-yyyy»)); ' ** 02-09-2012 ** – qJake

+0

@SpikeX Что такое вашей культуре (точнее, каково значение для DateTimeFormatInfo.CurrentInfo.DateSeparator)? –

+0

@SpikeX Вот что ваш код производит на моей (европейской) машине: Console.WriteLine (DateTime.Now.ToString («MM/dd/yyyy»)); 02-09-2012 Console.WriteLine (DateTime.Now.ToString («MM-dd-yyyy»)); 09.02.2012 –

3

Изменить

Convert.ToDateTime("16-02-2012").ToString("MM/dd/yyyy") 

в

Convert.ToDateTime("16-02-2012").ToString("dd/MM/yyyy") 

Это просто опечатка.


Если это не то, что вы хотите, попробуйте следующее:

DateTime.Parse("16-02-2012", CultureInfo.CreateSpecificCulture("da-DK")); 

Затем вы можете добавить, что .ToString(...) вы хотите на конце.


Редактировать 2: Ваш компьютер выводит дату в вашей собственной культуре. Если вы хотите, чтобы он разобрал и отображался правильно, вам необходимо предоставить информацию о культуре для каждой операции.

Console.WriteLine(DateTime.Parse("16-02-2012", CultureInfo.CreateSpecificCulture("da-DK")).ToString(CultureInfo.CreateSpecificCulture("da-DK"))); 
// 16-02-2012 00:00:00 
+0

Не имеет значения, что такое разделитель. – qJake

+0

Я не могу изменить код, как вы предлагаете, потому что это приведет к неправильному результату, когда мне нужно отформатировать дату с 16-02-2012 по 02/16/2012. – Marle1

+0

См. Edit. Еще 6. – qJake