C# DateSime проблема разбора
У меня есть проект, созданный с 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 = "Загрузить (&Initializer)"}, Y = 22 = 86 = X = 86 = X = 86 = E Кнопка = влево}) Строка 51 + 0xe байт C# [Внешний код] NwindObjectsCS.exe!NwindObjectsCS.Program.Main() Строка 18 + 0x1d байт C# [Внешний код]
В чем проблема?
Я скачал код с веб-сайта WROX. Код взят из книги "Профессиональный ADO.NET 3.5 с LINQ и Entity Framework". Автор "Роджер Дженнингс". Так что не должно быть никаких проблем.
Это из 3-й главы.
6 ответов
Я попробовал это (моя машина установлена на "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));
Если вы запустите его в отладчике, он должен показать вам, что именно вызвало исключение. Беглый взгляд, ваши строки дат кажутся действительными для локали en-US, я могу только подозревать, что проблема в другом месте (например, в конструкторе одного из ваших объектов?)
Возможно, вы установили какой-то необычный DateFormat, указанный в региональных настройках вашей ОС, который используется в CultureInfo, который вы создаете. Чтобы узнать об этом, попробуйте то, что вы получите при запуске
new DateTime(2006,7,4).ToString();
Я не могу попробовать свою систему, но, возможно, вы сможете получить CultureInfo по умолчанию без ваших настроек с помощью
OrderDate = DateTime.Parse("7/4/2006", new CultureInfo("en-US"))
Я должен подумать, что это связано с вашими текущими настройками глобализации и датой 16.07.2006, и он думает, что это в формате дд / мм / гггг, поскольку 16-й месяц не действителен.
В начале вашего скрипта запустите эту строку:
MessageBox.Show (CultureInfo.CurrentCulture.ToString ());
Что это показывает?
Почему вы анализируете жестко закодированное время, а не создаете его напрямую:
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()}};
Подумайте, что вам нужно добавить время, попробуйте добавить "07:00 AM" в строки даты.