2015-12-09 4 views
6

У меня возникла проблема с преобразованием дат в заданном формате ввода в целевой. Есть ли стандартный способ сделать это на C#?Преобразование между форматами даты и времени

Например, у нас есть yyyy.MM.dd в качестве исходного формата, а целевой формат - MM/dd/yyy (текущая культура).

Проблема возникает из-за того, что я использую стратегию синтаксического анализа, которая отдает приоритет текущей культуре, а затем, если она не работает, она пытается разобрать из списка известных форматов. Теперь скажем, что у нас есть две эквивалентные даты в культуре источника выше (2015.12.9), а другая в текущей культуре (9/12/2015). Затем, если мы попытаемся проанализировать эти две даты, месяц будет 12 для первого случая, а во втором будет 9, поэтому у нас есть несогласованность (они должны были быть одинаковыми точными датами).

Я считаю, что если существующие это должно быть что-то, как

DateTime.Convert(2015.12.9, 'yyyy/MM/dd', CultureInfo.CurrentCulture). 

Любые идеи?

EDIT:

Спасибо всем за ваши идеи и предложения, однако интерпретация большинство из вас дал на мой вопрос был не совсем прав. На то, что большинство из вас ответили, - это прямой анализ в данном формате, а затем преобразование в CurrentCulture.

DateTime.ParseExact("2015.12.9", "yyyy.MM.dd", CultureInfo.CurrentCulture) 

Это все равно вернет 12 в качестве месяца, хотя оно находится в формате CurrentCulture. Таким образом, мой вопрос был, есть ли стандартный способ трансформировать дату в yyyy.MM.d в формат MM/dd/yyy, чтобы месяц был в правильном месте, а THEN проанализировал его в целевой культуре. Такая функция, вероятно, будет неистинной.

+0

Или, [Datetime.TryParse] (https://msdn.microsoft.com/en-us/library/9h21f14e%28v = vs.110% 29.aspx) принимает информацию о формате (пример на связанной странице). –

+1

Что вы будете делать, если текущая культура 'yyyy-mm-dd', а входящая дата' 09/12/2015'?Вы не можете знать, равна ли дата ввода mm/dd/yyyy или dd/mm/yyyy –

+0

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

ответ

8

DateTime.ParseExact является то, что вы ищете:

DateTime parsedDate = DateTime.ParseExact("2015.12.9", "yyyy.MM.d", CultureInfo.InvariantCulture); 

Или eventualy DateTime.TryParseExact если вы не уверены в строке ввода.

+0

Здесь вы можете проверить все доступные форматы: https: //msdn.microsoft.com/library/8kb3ddd4 (v = vs.110) .aspx – Ksv3n

1

Я знаю, что уже поздно, но я пытаюсь объяснить немного глубоко, если вы позволите мне ..

Я столкнулся с проблемой, в которой мне нужно преобразовать даты в любом формате к цели один.

Нет такой вещи, как даты в любом формате. A DateTime не имеет любой неявный формат. Он имеет только даты и время. Похоже, у вас есть string, который отформатирован как дата, и вы хотите конвертировать еще string с различными форматом.

Есть ли стандартный способ сделать это на C#?

Да.Вы можете разобрать свой string с DateTime.ParseExact или DateTime.TryParseExact сначала с определенным форматом до DateTime, а затем сгенерировать его string представление с другим форматом.

В качестве примера сказать, что мы имеем YYYY.MM.DD в качестве исходного формата и целевого формата ММ/дд/YYY (текущая культура).

Я не понимаю, что смысл текущей культуры в этом предложениях, и я предполагаю, что вы хотите yyyy не yyy, но вы можете создать его, как я описал выше, как;

string source = "2015.12.9"; 
DateTime dt = DateTime.ParseExact(source, "yyyy.MM.d", CultureInfo.InvariantCulture); 
string target = dt.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture); // 12/09/201 

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

Поскольку вы не показали любой стратегии синтаксического анализа и нет DateTime.Convert метода в .NET Framework, я не мог любой комментария.

Теперь у нас есть два равнозначных дата один в культуре источника выше (2015.12.9), а другие в текущей культуре (9/12/2015). Затем, если мы попытаемся проанализировать эти две даты, месяц будет 12, а в второй будет 9, поэтому у нас будет несогласованность.

Опять же .. Вы не имеют DateTime «с. Вы естьstring s. И эти форматированные строки не могут принадлежать к культуре. Конечно, все культуры могут разбора или генерации различных строковых представлений с одинаковым форматом формата в формате принадлежат любой культуре.

Я предполагаю, что у вас есть две разные строки, которые отличаются от формата, и вы хотите проанализировать ввод независимо от того, какой из них он придет. В таком случае вы можете использовать DateTime.TryParseExact overload, который принимает строковый массив для всех возможных форматов в качестве параметра. Затем создайте строковое представление с форматом MM/dd/yyy и культурой, которая имеет / как DateSeparator, как InvariantCulture.

string s = "2015.12.9"; // or 9/12/2015 
string[] formats = { "yyyy.MM.d", "d/MM/yyyy" }; 
DateTime dt; 
if (DateTime.TryParseExact(s, formats, CultureInfo.InvariantCulture, 
          DateTimeStyles.None, out dt)) 
{ 
    Console.WriteLine(dt.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture)); 
} 
+0

Извините, я не был достаточно явным, даты являются строками, но они могут быть в любом формат, который неизвестен априори; он обнаруживается при сбое синтаксического анализа текущей ситуации. Это, я делаю DateTime.TryParse (s, форматы, CultureInfo.CurrentCulture, out datetimevalue), а затем, если это не удается, я делаю DateTime.TryParseExact (str, dateFmts, culture, out datetimevalue) – user3853059

+0

@ user3853059 Извините, но вы может ** не ** анализировать каждую возможную форматированную строку одним методом. Вы должны знать, какую строку формата у вас есть, чтобы она могла успешно разбираться. Если вы получите это как вход откуда-то, возможно, было бы лучше использовать некоторую проверку в пользовательском интерфейсе. Помимо этого, насколько мне известно, это невозможно. –

+0

@ Downvoter позаботится прокомментировать, по крайней мере, чтобы я мог видеть, где я _might_ ошибаюсь? –

0

Простой и лучший способ сделать это с помощью .ToString() Метод
Смотрите этот код:

DateTime x =DateTime.Now; 

преобразовать этот раз писать именно так:

x.ToString("yyyyMMdd")//20151210 
x.ToString("yyyy/MM/dd)//2015/12/10 
x.ToString("yyyy/MMM/dd)//2015/DEC/10 //Careful About M type should be capital for month . 

Надеемся на помощь

Смежные вопросы