Формат даты С# против формата даты Windows

Получил базу данных SQL Server, имеющую таблицу со столбцом типа «Дата».

При выполнении выбора в таблице с помощью обозревателя объектов SQL Server в Visual Studio значение поля возвращается как «2016-01-17», что является правильным.

Но при выполнении из С#

cmd = new System.Data.SqlClient.SqlCommand("SELECT * FROM MyTable WHERE id = '" + id + "';", conn); 
reader = cmd.ExecuteReader();
while (reader.Read())
{
    string dateString= String.Format("{0:MM/dd/yyyy}",((DateTime)reader[columnName]));
}

dateString получается 01 17 2016 .. не ожидаемое 17.01.2016

Я также пробовал:

string dateString = ((DateTime)reader[columnName]).ToString("MM/dd/yyyy");
string dateString = String.Format("{0:MM/dd/yyyy}", (reader[columnName]));

Но оба получают одинаковый результат 01 17 2016 без косой черты.

Один последний тест, который я сделал, заключался в том, чтобы просто преобразовать поле в строку без формата, и оно получилось как Sun 17 Jan 00:00:00:

string val = reader[columnName].ToString();

^^ Я собирался спросить вас, ребята, что, черт возьми, происходит, но потом я вспомнил, как пару дней назад я изменил короткую дату в календаре Windows 7 на формат ddd MMM dd (т. е. щелкните календарь в системном трее и измените настройки даты/времени). ).

Я не хочу, чтобы формат даты/времени пользователя в Windows влиял на функцию отображения даты и времени в моем коде C# или SQL Server (это приводит к нарушению ряда вещей, которые зависят от форматирования).

Что я могу сделать, чтобы предотвратить эту проблему?


person Kairan    schedule 26.10.2020    source источник
comment
Вы пытались использовать CultureInfo.Invariant, чтобы избежать настройки региональных параметров пользователя?   -  person AlwaysLearning    schedule 27.10.2020
comment
@AlwaysLearning - я не учился, я погуглю и изучу - мне следует быть более осторожным с датой / временем - было лень   -  person Kairan    schedule 27.10.2020


Ответы (1)


В формате даты строка, "/" не является буквальным символом, а представляет собой разделитель даты локали.

Судя по всему, в вашей локали разделителем даты является пробел.

Согласно связанной документации, вы можете избежать ее с помощью одинарных кавычек, чтобы получить буквальную косую черту:

string dateString= String.Format("{0:MM'/'dd'/'yyyy}",((DateTime)reader[columnName]));

(это приводит к поломке ряда вещей, которые зависят от форматирования).

В любом случае это плохо — нужно разделять форму и функцию. С этим исправлением вы можете с радостью отображать даты для своих пользователей в форме, с которой они наиболее знакомы, и в форме, которую они ожидают.

person Asteroids With Wings    schedule 26.10.2020
comment
tl;dr Если вы сомневаетесь, прочитайте документы! Я не разработчик C# и никогда не использовал эти функции; Я только что наткнулся на ваш вопрос и нашел ответ в течение нескольких минут после просмотра документации по функциям, которые вы использовали. Они должны были быть вашим первым портом захода. Веселиться! - person Asteroids With Wings; 27.10.2020
comment
похоже, вы правы - я изменил окна на ddd/MMM/dd, и тогда все работает нормально. часть кода, о которой я упоминал, была просто написанным мной методом, который проверяет, находится ли дата из текстового поля (автоматически заполненная этой датой из БД) в допустимом формате. так как я жестко запрограммировал проверку /, она не удалась и не позволила мне использовать дату для обновления записи. я помню, что в С# есть способ получить значение разделителя даты (возможно, его DateTimeFormatInfo.DateSeparator), я не могу это проверить и посмотреть, могу ли я выполнить проверку по-другому, чтобы мой код не сломался таким образом - person Kairan; 27.10.2020