DateTime проблема, когда день <= 12 - PullRequest
6 голосов
/ 22 июня 2011

Я много осматривался, и мне не хватало написания ужасного куска кода для манипулирования строкой. Я хотел бы спросить, знает ли кто-нибудь хороший способ сортировки:

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

03/05/2011
27/05/2011
31/05/2011
03/05/2011
09/05/2011
31/05/2011
и т.д.

В то время как я читаю любые регионы, где день может быть истолкован как месяц - то есть записи 1, 4 и 5 выше - он вставляется как DateTime с заменой дня и месяца.

Например, 03/05/2011 читается как DateTime "05/03/2011 00:00:00" Все остальные прочитаны и предоставили мне простую строку «27/05/2011».

Я получаю эту информацию из Excel, используя

((Excel.Range)worksheet.Cells[rowCount, 3]).Value.ToString()

Если я попытаюсь использовать Value2, как и в других моих строках, эти нечетные даты будут считываться как «40607», но, опять же, будут нормально читать другие даты.

Ответы [ 5 ]

8 голосов
/ 22 июня 2011

Если вы используете функцию DateTime.ParseExact для преобразования строки в объект DateTime, вы можете указать конкретный формат, используемый вашими датами (который выглядит как «день / месяц / год») без необходимости каких-либо манипуляций со строками.

Пример:

var dateString = "03/05/2011";

var format = "dd/MM/yyyy";

var date = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture);

Более подробную информацию о пользовательских строках формата даты и времени можно найти здесь .


РЕДАКТИРОВАТЬ: Попробуйте использовать метод DateTime.FromOADate для преобразования значения, возвращаемого свойством Range.Value2, в объект DateTime, например. как то так:

var dateTime = DateTime.FromOADate(((Excel.Range)worksheet.Cells[rowCount, 3]).Value2);
2 голосов
/ 22 июня 2011

Метод DateTime.ParseExact преобразует указанное строковое представление даты и времени в его эквивалент DateTime с использованием указанного формата и информации о формате, специфичном для культуры.

Формат представления строки должен точно соответствовать указанному формату.

String dateString = "15/06/2008";
String format = "dd/MM/yyyy";

DateTime result = 
   DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture);
1 голос
/ 22 июня 2011

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

Нет, вы не делаете.У вас есть смесь строк, которые выглядят как даты и даты, которые выглядят как строки .Это проблема Excel, а не проблема C #.

Не уверен, что вы создаете электронную таблицу или получаете ее откуда-то еще.Но проблема в том, что Excel пытается разобрать текст , как он введен в ячейку .В этом случае он принимает неправильные решения в отношении дат, которые он находит.

Если вы введете дату, например «03/05/2011», Excel (неправильно) проанализирует ее как 5 марта 2011 г., исохранить это как числовой код даты (40607).Затем он применяет к ячейке форматирование даты (на моей машине он использует m / d / yyyy).

Если вы введете дату, например «31/05/2011», Excel не сможет проанализировать ее как дату и сохранит ее в виде текста.

Чтобы доказать это, выберите ячейкии перейдите в «Правка»> «Очистить»> «Форматы».Все «плохие даты» будут отображаться в виде чисел, все остальные будут выглядеть как даты.

У вас есть несколько вариантов:

  1. Исправьте данные перед их вводом в Excel(добавьте все к ', чтобы все вводилось как текст, или убедитесь, что электронную таблицу создали на компьютере с правильными настройками даты.)
  2. Не используйте .Value.ToString() из Excel, просто используйте.Text.Это позволит игнорировать неправильный синтаксический анализ, который выполнял Excel, и должен дать вам согласованное текстовое значение (из обоих типов), которое вы можете ParseExact с C # для других ответов.

(2)намного проще, и если электронные таблицы уже существуют, может быть, ваш единственный выбор.

1 голос
/ 22 июня 2011

Звучит как проблема локализации.Попробуйте установить свой язык неявно.Например, в приложении WPF это что-то вроде:

System.Threading.Thread.CurrentThread.CurrentCulture = 
    new System.Globalization.CultureInfo("en-US");
0 голосов
/ 22 июня 2011

Проблема в том, что ваши Даты читаются как американская культура или что-то подобное.

Если вы используете следующее, вы можете указать формат, в котором вы ожидаете даты: use

DateTime result;
if(DateTime.TryParseExact("dd/MM/yyyy", out result))
{
   // Got an English date
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...