2009-10-01 6 views
1

С .NET у меня есть «четверг, 10 апреля 2008 г., 13:30», и я хочу «dddd, dd MMMM, yyyy h: m: st», 6:09:01 PM «и хочу« hh: mm: ss tt »,« Fri 29 Aug »и хочу« ddd d MMM »и т. Д. Кажется, я должен каким-то образом использовать DateTimeFormatInfo.Как преобразовать строку DateTime в строку формата

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

Я хочу строку формата. Мне не нужна дата. У меня есть значение DateTime и форматированное строковое значение для даты. eed <formatString> как в ToString(<formatString>).

+0

вы ищете для пользовательских форматов доступный за пределами DateTime.Now.ToString ("ddd mm YYYY") и т. д.? – JustLoren

+0

Что вы понимаете под парсинг DateTime ** String ** в пользовательскую дату и формат времени ** string **. Вы хотите преобразовать строковое представление даты/времени в другое? Является ли оригинал действительно строкой? –

+0

Я обновляю свой вопрос, чтобы помочь прояснить, чем я занимаюсь. – AMissico

ответ

3

Прежде всего, у вас уже есть тип DateTime, или у вас есть строка? Если последний, посмотрите на функции DateTime.ParseExact() или DateTime.TryParseExact(), чтобы превратить эту строку в DateTime.

Как только у вас есть DateTime, это легко. Просто вызовите метод DateTime .ToString().

Ключом к обеим частям является не DateTimeFormatInfo. Вместо этого вы используете format string. Вы используете строку формата с функциями [Try] ParseExact() и функцией ToString().

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

+0

Это не отвечает на мой вопрос. Я хочу, чтобы «строка формата» представляла собой «строка даты». – AMissico

+0

@AMissico: Я думаю, вы могли бы попробовать какое-то дурацкое регулярное выражение, но я согласен с Джоэлем: лучше всего получить исходную строку в объект DateTime. – wweicker

+0

@wweicker - У меня есть объект DateTime и форматированное значение. Я думал о регулярных выражениях, но я могу сделать основной материал для обработки кода сура. Ничего не вышло. Более того, я чувствую, что использование регулярных выражений может сделать процесс слишком сложным. – AMissico

1

Если вы хотите конвертировать фактические строки даты в строки формата C# DateTime, это невозможно сделать надежно.

Как, например, вы бы справиться с этой строки:

03/04/05 9:00 

несколько проблем с этим примером:

  1. Вы не знаете, это месяц, который год и т.д.
  2. Вы не знаете, должна ли строка формата использовать 12- или 24-часовые часы.
  3. Вы не знаете наверняка, должны ли минуты отображаться точно или всегда заменяться 00.
+0

Да, я согласен с тем, что не могу надежно, но если вы используете CultureInfo.DateTimeFormatInfo, то он должен быть достаточно надежным. В вашем примере это будет «MM/DD/yy h: mm», что достаточно близко, потому что мне все равно, если это 9 утра или 2100. Это зависит от пользователя. – AMissico

+0

# 1 будет разрешен с помощью CultureInfo.DateTimeFormatInfo. – AMissico

+0

# 2 - проблема ввода данных, и пользователь может ее исправить. – AMissico

1

Передайте формат ToString. Используя формат, указанный:


DateTime d = DateTime.Now; 
Console.WriteLine(d.ToString("dddd, dd MMMM, yyyy h:m:s t")); 
Console.WriteLine(d.ToString("hh:mm:ss tt")); 
Console.WriteLine(d.ToString("ddd d MMM")); 

ОБНОВЛЕНО, чтобы отразить изменения в вопросе.

Данная строка даты/времени может соответствовать одной или нескольких строк формата, но вы можете стать ближе к тому, что вы хотите сделать что-то по следующим направлениям:


class FindDateTimeFormat { 
    public static void Show() { 
     foreach (string item in GetMatchingFormats("Thursday, April 10, 2008 1:30:00 PM")) { 
      Console.WriteLine(item); 
     } 
    } 

    private static string[] GetMatchingFormats(string dateTimeString) { 
     DateTimeFormatInfo formatInfo = CultureInfo.CurrentCulture.DateTimeFormat; 
     List matchingFormats = new List(); 
     foreach (string format in formatInfo.GetAllDateTimePatterns()) { 
      try { 
       DateTime dateTime = DateTime.ParseExact(dateTimeString, format, null); 
       if (!matchingFormats.Contains(format)) { 
        matchingFormats.Add(format); 
       } 
      } 
      catch (FormatException) { 
      } 
     } 
     return matchingFormats.ToArray(); 
    } 
} 

+0

Не отвечая вопрос. – AMissico

+0

Не отвечает на него как? Это соответствует моему пониманию вашего вопроса ... – RedFilter

+0

Комментарий был для исходного ответа, а не для обновленного ответа. – AMissico

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