Преобразование DateTime не работает при чтении дат из Excel, где Day> 12 - PullRequest
0 голосов
/ 24 января 2019

Это мои первые 5 строк в моем файле XLSX:

enter image description here

Обратите внимание, что формат для столбца ResLastCallDate - CustomFormat->dd/mm/yyyy hh:mm:ss.Тем не менее, ряд 4 выглядит по-другому, чем другие.Во многом это не важно, важная часть заключается в том, что файл XLSX загружается на мою веб-страницу asp.net 4.5, где я читаю данные через EPPlus.Однако, когда я читаю столбец ResLastCallDate, я получаю сообщение об ошибке.См. Код ниже:

System.Globalization.CultureInfo provider = System.Globalization.CultureInfo.InvariantCulture;
if (!DateTime.TryParse(dr["ResLastCallDate"].ToString(),provider, System.Globalization.DateTimeStyles.AssumeLocal, out resLastCallDate))
{
     Msg = Msg + string.Format("Row {0}: ResLastCallDate is not date ({1}).\n", r, dr["ResLastCallDate"].ToString());
}
...
txtDebug.Text = Msg;

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

Row 0: ResLastCallDate is not date (20/03/2018 13:58)
Row 1: ResLastCallDate is not date (20/03/2018 13:58)
Row 3: ResLastCallDate is not date (15/03/2018 20:25)

Итак, строка 2 (которая равна ClientID = 3621) работает, но другие не по причине.Я пробовал форматы General и Date в excel для этих ячеек, но до сих пор не работает.Что еще я могу сделать, чтобы решить эту проблему?Любая помощь будет принята.

РЕДАКТИРОВАТЬ: Когда я преобразую его в dr ["ResLastCallDate"]. Только ToString () (никакой провайдер я не использую), он работает на моем локальном компьютере, но когда я публикую насервер не работает (получено то же сообщение об ошибке)

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Похоже, что CultureInfo.InvariantCulture не любит получать строки в этом конкретном формате.Я полагаю, что это связано с тем, что в США дата записывается в порядке MM / дд / гггг, тогда как в Европе она записывается в формате дд / мм / гггг (включая Великобританию и Австралию).

Еслив этом случае 20/03/2010 13:58 было бы проанализировано как 3-й день 20-го месяца 2010 года, что не имеет никакого смысла.

Я полагаю, используя `new CultureInfo (" en-gb ") вместо CultureInfo.InvariantCulture будет лучшим выбором здесь.

0 голосов
/ 24 января 2019

Пожалуйста, используйте соответствующую культуру.

var originalDate = "6/4/18 6:07 PM";
DateTime parsedDate;

var culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-AU");
var styles = System.Globalization.DateTimeStyles.None;
if (!DateTime.TryParse(originalDate, culture, styles, out parsedDate))
{
       Console.WriteLine(parsedDate);
}

        Console.WriteLine($"Parse successfull: {parsedDate}");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...