2009-10-14 13 views

Odpowiedz

12

wypracować dwa formaty, które chcesz, a następnie użyć:

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

Na przykład:

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

super, dzięki dla tego – raklos

2

Jeśli łańcuch jest prawidłowym formacie datetime że. Netto może zrozumieć, wszystko czego potrzebujesz to:

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

edycja: Wiele rozsądnych formaty datetime są zrozumiałe przez Net bez wyraźnej specyfikacji formatu, ale jeśli ktoś nie jest specyficzne, a następnie trzeba będzie użyć wyraźnego formatu specyficzny.

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

"C#" nie ma żadnych poprawnych formatów datetime - .NET ma domyślne formaty, które DateTime.Parse zaakceptuje, ale zależą one od kultury systemu. Lepiej być wyraźnym, IMO. –

+0

Edytowane w celu poprawienia, ale Jon, nie będąc jawnym, ma przewagę nad obsługą wszystkich formatów, które .Net rozumie "po wyjęciu z pudełka", że tak powiem ... W zależności od scenariusza/wymagań, powiedziałbym, że każdy technika ma swoje miejsce. –

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

To się nie udaje na moim pudełku - zakładasz, że Convert.ToDateTime obsłuży ten format, co nie będzie miało miejsca w kulturze Wielkiej Brytanii. –

0

Są bardzo dobre rozwiązania, ale jeśli coś przekazać, że nie pasuje do wzorca będą rzucać wyjątków. Lubię korzystać z klasy SmartDate od CSLA, http://www.lhotka.net/cslanet/download.aspx, sam. Bardzo dobrze radzi sobie z wartościami zerowymi i nieprawidłowymi wartościami. Funkcja TryStringToDate jest gdzie magia dzieje:

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; 
    } 

Należy więc ostatecznie skończyć z czymś takim:

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

można spróbować coś takiego:

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"); 
Powiązane problemy