2012-03-09 17 views
7

Czy istnieje wartość formatu DateTime.ToString (""), która określi dzień roku trzema cyframi?Format daty Dzień roku

Na przykład:

  • 01 stycznia 2012 będzie 001
  • 01 lutego 2012 będzie 032
  • 31 grudnia 2012 będzie 366 (rok przestępny)
  • gru 31, 2011 byłby 365

Odpowiedz

21

Nie, można użyć DateTime.DayOfYear .ToString ("000");

Twoje przykłady:

new DateTime(2012, 1, 1).DayOfYear.ToString("000"); 
new DateTime(2012, 2, 1).DayOfYear.ToString("000"); 
new DateTime(2012, 12, 31).DayOfYear.ToString("000"); 
new DateTime(2011, 12, 31).DayOfYear.ToString("000"); 
+0

porażka , ale to jest prawie tak dobre dzięki. – Dismissile

+0

Napisałeś tak szybko. -) –

0

Potrzebowałem sposobu, aby umożliwić użytkownikom nadanie formatu, który poradziłby sobie z dniem w roku i wymyśliłem następujący kod.

public static string FormatDate(this DateTime date, string format) 
{ 
    var builder = new StringBuilder(); 
    int numOfjs = 0; 
    bool escaped = false; 
    foreach (char c in format) 
    { 
     if (c == 'j' && !escaped) 
     { 
      numOfjs++; 
     } 
     else 
     { 
      if (c == 'j' && escaped) 
      { 
       builder.Remove(builder.Length - 1, 1); 
      } 

      if (numOfjs > 0) 
      { 
       var dayOfYearFormat = new string('0', Math.Min(3, numOfjs)); 
       builder.Append(date.DayOfYear.ToString(dayOfYearFormat)); 
      } 

      numOfjs = 0; 
      builder.Append(c); 
     } 

     escaped = c == '\\' && !escaped; 
    } 

    if (numOfjs > 0) 
    { 
     var dayOfYearFormat = new string('0', Math.Min(3, numOfjs)); 
     builder.Append(date.DayOfYear.ToString(dayOfYearFormat)); 
    } 

    return date.ToString(builder.ToString()); 
} 

Pozwala to na posiadanie formatu, który zastąpi kolejne nieprzypisane litery j do dnia roku. Zeruje pad do 3 cyfr na podstawie liczby j. Więcej niż 3 następujące po sobie j, jak tylko 3.

Zasadniczo przepisuje format, aby zastąpić wyodrębnione j, j i kolejne j w dniu roku. Następnie przekazuje ten nowy format do DateTime.ToString().

0

wiem, że to jest nieco stary, ale jeśli absolutnie, pozytywnie, trzeba to zrobić w jednej linii kodu, bez dostępu do funkcji DateTime.DayOfYear (jak miałem zrobić dzisiaj):

int myDay = floor(Now() - Date(parseInt(Now().ToString("yyyy")), 1, 1)) + 1; 
+0

Ciekawy jestem, jaki jest twój przypadek użycia, gdzie: a) musiałeś to zrobić w jednym wierszu kodu i b) bez DayOfYear – Dismissile

+0

Skrypt po stronie użytkownika, styl MS Access. Jasne, mogłem wejść i dodać funkcję, o której istnieniu nawet nie zdawaliśmy sobie sprawy, kiedy napisano skrypt, ale wtedy musielibyśmy przekompilować i przetestować klienta, a następnie zmarnować o wiele więcej czas i czas klienta na przypadek użycia, który nigdy nie pojawił się w ciągu dekady, ale jest o wiele lepiej, jeśli możemy to zrobić za pomocą już dostarczonych funkcji. – Trevortni