2009-10-12 5 views
0

У меня есть проект, созданный с VS2010. Я запускаю проект из VS2008. Plz отмечает, что я не использую решение. Я выполняю проект только. К счастью, решение имеет только один проект.C# DateTime parsing problem

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

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 (object sender = {Text = "Load (Initializer)"}, System.EventArgs e = {X = 86 Y = 22 Button = Left}) Строка 51 + 0xe байты C# [External Code] NwindObjectsCS.exe! NwindObjectsCS.Program.Main() Строка 18 + 0x1D байт C# [Внешний код]

Что предполагают, чтобы быть проблема?

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

Это из третьей главы.

+0

, что культура это работает под? Я вижу создание, специфичное для en-US, но какова культура, над которой проходит процесс? Не уверен, что это имеет значение. –

+0

Настройки моего компьютера - «Американский английский». – anonymous

+0

Так что тогда вам не понадобится бит CultureInfo. Я не уверен, что это поможет. Я получил ваш код, чтобы нормально работать в vs2008. У меня сейчас нет vs2010, поэтому я не могу проверить ситуацию, которая у вас там есть. Я запускаю его на компьютере en-GB. Вы могли бы увидеть, можете ли вы снова нарушить проблему. –

ответ

2

I попробовал это (Моя машина настроена на «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(); 
} 

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

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

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

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

ParseExact: -

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

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

DateTime.Parse("16/7/2006", new CultureInfo("en-GB", false)); 
+0

ОК. Наконец, это решило мою проблему. – anonymous

+0

Это даже в документации. Я этого не знал. Звучит ужасно. Кажется, есть второй параметр, который вы можете установить для этого, вы можете добавить его в свой ответ. – Kobi

+0

Оказывается, эта проблема совершенно не связана с кодированием. – anonymous

1

Мне кажется, что это связано с вашими текущими настройками глобализации и датой 7/16/2006, и она думает, что она находится в формате dd/mm/yyyy, так как 16-й месяц недействителен.

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

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

Что это показать?

+0

Не использует ли США формат mm/dd/yyyy? – anonymous

+0

Это показывает «en-US». – anonymous

+0

, тогда я согласен с Вирджилом, это должно быть с каким-то конструктором в вашем классе Customer, Employee или Shipper – Psytronic

-2

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

+0

Но зачем мне это нужно? Можете ли вы немного объяснить? – anonymous

+0

И это не сработало. Сожалею! – anonymous

2

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

+0

Правильно, все три 'DateTime.Parse' работают хорошо. – Kobi

0

Почему вы разбираете жёстко даты и времени, а не строить его непосредственно:

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

Я загрузил этот код с веб-сайта WROX. Я не знаю, почему автор решил это сделать. – anonymous

1

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

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

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

OrderDate = DateTime.Parse("7/4/2006", new CultureInfo("en-US"))