2012-03-09 14 views
7

Esiste un valore di formato per DateTime.ToString ("") che specificherà il giorno dell'anno in tre cifre?DateTime Format Day of Year

Ad esempio:

  • 1 gen, il 2012 sarebbe stato 001
  • Feb 1, 2012 sarebbe 032
  • 31 dicembre 2012 sarebbero 366 (anno bisestile)
  • 31 dicembre, 2011 sarebbero 365

risposta

21

No, è possibile utilizzare DateTime.DayOfYear .ToString ("000");

I suoi esempi:

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

Bummer , ma questo è quasi altrettanto buono, grazie. – Dismissile

+0

Hai digitato così velocemente. -) –

0

Avevo bisogno di un modo per consentire agli utenti di fornire un formato in grado di gestire il giorno dell'anno e mi è venuto in mente il seguente codice.

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

Ciò consente di disporre di un formato che sostituirà la lettera j consecutiva non delimitata con il giorno dell'anno. Zero pad fino a 3 cifre in base al numero di j. Più di 3 j consecutivi come 3 3.

Fondamentalmente riscrive il formato per sostituire le j delimitate con solo un j, e le j consecutive con il giorno dell'anno. Passa quindi questo nuovo formato a DateTime.ToString().

0

So che questo è un po 'vecchio, ma se si assolutamente, positivamente, hanno a che fare in una sola riga di codice, senza l'accesso alla funzione DateTime.DayOfYear (come ho dovuto fare oggi):

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

Sono curioso di sapere qual è il tuo caso d'uso dove a) dovevi farlo in una singola riga di codice eb) senza DayOfYear – Dismissile

+0

Script lato utente, stile MS Access. Sì, certo, sarei potuto entrare e ho aggiunto la funzione che non avevamo nemmeno realizzato quando il gestore di script è stato scritto, ma poi avremmo dovuto ricompilare e testare e ottenere il nuovo build del cliente e sprecare molto di più del nostro tempo e tempo del cliente per un caso d'uso che non è mai spuntato nel decennio o giù di lì il programma è stato intorno, ma è molto meglio se possiamo farlo con le funzioni già fornite. – Trevortni