Несовместимый формат даты при написании CSV - PullRequest
0 голосов
/ 18 сентября 2018

У меня очень странная проблема. Я пишу в файл CSV, как это:

sw.WriteLine($"{posting.publishedOn},{posting.ExpirationDate}");

Дата публикации - это объект DateTime, а Срок действия - объект DateTime?.

Однако, когда я запускаю это на своем производственном сервере в Германии, это очень непоследовательно в отношении того, какой формат даты он печатает. Иногда у меня будут даты, отформатированные так (европейский стиль):

Posting Date,Expiration Date
06.08.2018 11:49,08.07.2018 11:49

И иногда у меня будут даты, отформатированные так (стиль США):

Posting Date,Expiration Date
8/15/2018 7:56:12 AM,10/14/2018 7:56:12 AM

Дата публикации и дата окончания срока действия являются полностью отдельными объектами .NET, но каждая строка будет согласованной, т. Е. Если один столбец будет в европейском формате, другой будет также.

Я пытался настроить культуру так:

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

но, похоже, это не имело значения.

Это происходит, когда я запускаю консольное приложение на моем сервере в Германии.

Что может быть причиной этого? Есть ли способ исправить это без необходимости явно вызывать ToString с форматом каждый раз, когда я пишу дату?

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Я считаю, что вам нужно просто установить конкретную культуру следующим образом:

CultureInfo.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");

0 голосов
/ 18 сентября 2018

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

Потому что, если нет, то это может быть проблемой.

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

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

sw.WriteLine($"{posting.publishedOn},{posting.ExpirationDate}");
0 голосов
/ 18 сентября 2018

Установите формат явно, например:

sw.WriteLine($"{posting.publishedOn.ToString("MM/dd/yyyy hh:mm tt")},{posting.ExpirationDate?.ToString("MM/dd/yyyy hh:mm tt")??""}");

РЕДАКТИРОВАТЬ: Просто понял, что вы явно сказали, что вы не хотите этого решения.Я оставлю свой ответ на случай, если другие найдут ваш вопрос и ToString будет подходящим решением.

...