2009-10-14 8 views

ответ

12

Отработать два формата, которые вы хотите, а затем использовать:

DateTime dt = DateTime.ParseExact(input, inputFormat, 
            CultureInfo.InvariantCulture); 
string output = dt.ToString(outputFormat, CultureInfo.InvariantCulture); 

Например:

using System; 
using System.Globalization; 

class Test 
{ 
    static void Main(string[] args) 
    { 
     string input = "10/13/2009 12:00:00 AM"; 
     string inputFormat = "MM/dd/yyyy HH:mm:ss tt"; 
     string outputFormat = "yyyyMMdd"; 
     DateTime dt = DateTime.ParseExact(input, inputFormat, 
              CultureInfo.InvariantCulture); 
     string output = dt.ToString(outputFormat, CultureInfo.InvariantCulture); 
     Console.WriteLine(output); 
    } 
} 
+0

большой, спасибо для этого – raklos

2

Если строка является действительным DateTime формат, который. Net может понять, все, что вам нужно:

DateTime.Parse(yourString).ToString("yyyyMMdd") 

Редакция: Многие разумные форматы DateTime понятны .Net без явной спецификации формата, но если ваш конкретный один не является, то вам нужно будет использовать явный формат спецификатор.

DateTime.ParseExact(yourString, format, 
     CultureInfo.InvariantCulture)).ToString("yyyyMMdd") 
+1

«C#» не имеет допустимых форматов даты и времени. В .NET есть стандартные форматы, которые DateTime.Parse будет принимать, но они зависят от культуры системы. Лучше быть явным, ИМО. –

+0

Отредактировано для исправления, но Джон, не будучи явным, имеет преимущество в возможности обрабатывать ВСЕ форматы, которые .Net понимает «из коробки», так сказать ... В зависимости от сценария/требований я бы сказал, что каждый техника имеет свое место. –

0
string s = String.Format("{0:yyyyMMdd}", Convert.ToDateTime("10/13/2009 12:00:00 AM")); 
+2

Это не работает на моем ящике - вы предполагаете, что Convert.ToDateTime будет обрабатывать этот формат, которого он не будет в британской культуре. –

0

Это очень хорошие решения, но если вы что-то передать, что не соответствует шаблону, они будут бросать исключения. Мне нравится использовать класс SmartDate от CSLA, http://www.lhotka.net/cslanet/download.aspx, сам. Он отлично справляется с нулями и недопустимыми значениями. Функция TryStringToDate где происходит волшебство:

private static bool TryStringToDate(string value, EmptyValue emptyValue, ref DateTime result) 
    { 
     DateTime tmp; 
     if(String.IsNullOrEmpty(value)) 
     { 
      if(emptyValue == EmptyValue.MinDate) 
      { 
       result = DateTime.MinValue; 
       return true; 
      } 
      result = DateTime.MaxValue; 
      return true; 
     } 
     if(DateTime.TryParse(value, out tmp)) 
     { 
      result = tmp; 
      return true; 
     } 
     string ldate = value.Trim().ToLower(); 
     if(ldate == "SmartDateT" || 
      ldate == "SmartDateToday" || 
      ldate == ".") 
     { 
      result = DateTime.Now; 
      return true; 
     } 
     if(ldate == "SmartDateY" || 
      ldate == "SmartDateYesterday" || 
      ldate == "-") 
     { 
      result = DateTime.Now.AddDays(-1); 
      return true; 
     } 
     if(ldate == "SmartDateTom" || 
      ldate == "SmartDateTomorrow" || 
      ldate == "+") 
     { 
      result = DateTime.Now.AddDays(1); 
      return true; 
     } 
     return false; 
    } 

Таким образом, вы должны в конечном итоге ветер с чем-то вроде этого:

 SmartDate dt = new SmartDate(input); 
     dt.FormatString = outputFormat; 
     string output = dt.Text; 
     Console.WriteLine(output); 
0

Вы могли бы попробовать что-то вроде этого:

string myDate = "10/13/2009 12:00:00 AM"; 
DateTime result = new DateTime(DateTime.Now.Year, 1, 1); 
DateTime.TryParse(myDate, out result); 
string output = result.ToString("yyyyMMdd"); 
Смежные вопросы