C # DateTime проблема разбора - PullRequest
0 голосов
/ 12 октября 2009

У меня есть проект, созданный с VS2010. Я запускаю проект от VS2008. Пожалуйста, обратите внимание, я не запускаю решение. Я только работаю над проектом. К счастью, решение имеет только один проект.

И в следующей строке я имею исключение.

List<Order> OrderList = new List<Order> {
new Order 
{OrderID = 10248, 
CustomerID = "VINET", 
EmployeeID = 5, 
OrderDate = DateTime.Parse("7/4/2006", CultureInfo.CreateSpecificCulture("en-US")),
RequiredDate = DateTime.Parse("8/1/2006", CultureInfo.CreateSpecificCulture("en-US")),
ShippedDate = DateTime.Parse("7/16/2006", CultureInfo.CreateSpecificCulture("en-US")),
ShipVia = 3, Freight = 32.3800M, ShipName = "Vins et alcools Chevalier",
ShipCountry = "France", 
Order_Details = new List<Order_Detail>(), 
Customer = new Customer(), 
Employee = new Employee(), 
Shipper = new Shipper()}};

Исключение составляет:

FormatException was unhandled:
String was not recognized as a valid DateTime.

Трассировка стека:

NwindObjectsCS.exe! NwindObjectsCS.frmMain.CreateOrderList () Строка 142 C # NwindObjectsCS.exe! NwindObjectsCS.frmMain.btnInitializer_Click (отправитель объекта = {Text = "Load (& Initializer)"}, System.EventArgs e = {X = 86 Y = 22 Button = Left}) Строка 51 + 0xe байтов C # [Внешний код] NwindObjectsCS.exe! NwindObjectsCS.Program.Main () Строка 18 + 0x1d байт C # [Внешний код]

В чем проблема?

Я скачал код с веб-сайта WROX. Код взят из книги «Профессиональный ADO.NET 3.5 с LINQ и Entity Framework». Автор "Роджер Дженнингс". Так что не должно быть никаких проблем.

Это из 3-й главы.

Ответы [ 6 ]

2 голосов
/ 12 октября 2009

Я попробовал это (моя машина установлена ​​на "en-GB"): -

static void Main(string[] _args)
{
  DateTime d1 = DateTime.Parse("7/4/2006", CultureInfo.CreateSpecificCulture("en-GB"));
  DateTime d2 = DateTime.Parse("8/1/2006", CultureInfo.CreateSpecificCulture("en-GB"));
  DateTime d3 = DateTime.Parse("16/7/2006", CultureInfo.CreateSpecificCulture("en-GB"));
  System.Console.WriteLine("d1:" + d1.ToString());
  System.Console.WriteLine("d2:" + d2.ToString());
  System.Console.WriteLine("d3:" + d3.ToString());
  System.Console.ReadKey();
}

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

Похоже, что если вы настроили региональные настройки для указанного региона, то он ломается.

Вы настроили региональные настройки даты "en-US" на вашем компьютере?

Альтернативы.

ParseExact: -

DateTime.ParseExact("16/7/2006", "d/M/yyyy", CultureInfo.InvariantCulture);

Предложение Коби: -

DateTime.Parse("16/7/2006", new CultureInfo("en-GB", false));
2 голосов
/ 12 октября 2009

Если вы запустите его в отладчике, он должен показать вам, что именно вызвало исключение. Вкратце, ваши строки дат кажутся действительными для локали en-US, я могу только подозревать, что проблема в другом месте (например, в конструкторе одного из ваших объектов?)

1 голос
/ 12 октября 2009

Возможно, вы установили какой-то необычный DateFormat, указанный в региональных настройках вашей ОС, который принят в CultureInfo, который вы создаете. Чтобы узнать об этом, попробуйте то, что вы получите при запуске

new DateTime(2006,7,4).ToString();

Я не могу примерить свою систему, но, возможно, вы сможете получить CultureInfo по умолчанию без ваших настроек с помощью

OrderDate = DateTime.Parse("7/4/2006", new CultureInfo("en-US"))
1 голос
/ 12 октября 2009

Я должен подумать, что это связано с вашими текущими настройками глобализации и датой 16.07.2006, и он думает, что это в формате дд / мм / гггг, поскольку 16-й месяц недействителен.

В начале вашего скрипта запустите эту строку:

MessageBox.Show(CultureInfo.CurrentCulture.ToString());

Что это показывает?

0 голосов
/ 12 октября 2009

Почему вы анализируете жестко закодированное время, а не создаете его напрямую:

List<Order> OrderList = new List<Order> {
new Order 
{OrderID = 10248, 
CustomerID = "VINET", 
EmployeeID = 5, 
OrderDate = new DateTime(2006, 7, 4),
RequiredDate = new DateTime(2006, 8, 1),
ShippedDate = new DateTime(2006, 7, 16),
ShipVia = 3, Freight = 32.3800M, ShipName = "Vins et alcools Chevalier",
ShipCountry = "France", 
Order_Details = new List<Order_Detail>(), 
Customer = new Customer(), 
Employee = new Employee(), 
Shipper = new Shipper()}};
0 голосов
/ 12 октября 2009

Думаю, вам нужно добавить время, попробуйте добавить "07:00 AM" в строки даты.

...