2011-10-24 4 views
36

Ho avuto questo problema un bel paio di volte e sono appena stato con una soluzione, ma ho pensato di chiedere qui nel caso ci sia una scelta più facile. Quando ho una stringa da DateTime.Now e poi voglio utilizzare questo in un nome di file non posso perché Windows non consente i caratteri/e: nei nomi dei file, devo andare e sostituirli in questo modo:Convert DateTime.Now a un nome di file valido di Windows

string filename = DateTime.Now.ToString().Replace('/', '_').Replace(':', '_'); 

che sembra un po 'di fastidio, c'è un modo più semplice per fare questo? Qualche suggerimento molto apprezzato.

+0

Si può utilizzare un modello più logico ISO8601-style come 'yyyyMMdd'? – tenfour

risposta

53
DateTime.Now.ToString("dd_MM_yyyy") 
+0

Grazie Royi, ha funzionato! –

+5

essere consapevoli dal capitale MM che è il mese e non mm che è minuto .. molto importante! –

+1

Ciò presuppone che la lingua non utilizzi caratteri di nome file non consentiti nel formato gg, MM o aaaa. Vero per l'inglese. Non necessariamente vero per altre lingue. –

8

utilizzare un modello ToString:

DateTime.Now.ToString("yyyy-MM-dd-HH-mm") // will produce 2011-10-24-13-10 
+2

Dovrai usare HH invece di hh o invece di 14 avrai 02 – xanatos

+0

Grazie, ho aggiornato l'esempio. – Samich

2

È possibile utilizzare formato lungo di data e ora:

DateTime.Now.ToBinary() 
39

Come scritto da Samich, ma

// The following will produce 2011-10-24-13-10 
DateTime.Now.ToString("yyyy-MM-dd-HH-mm", CultureInfo.InvariantCulture); 

Se don' t fiducia in me, provare a impostare la cultura a new CultureInfo("ar-sa"); :-)

io aggiungo che, se odiate il mondo, questa è la cosa più preciso per fare:

DateTime.Now.Ticks.ToString("D19"); 

ci sono 19 cifre in DateTime.MaxValue.Ticks

Se odiate la mondo ancora di più:

DateTime.Now.Ticks.ToString("X16"); 

ci sono 16 cifre esadecimali a DateTime.MaxValue.Ticks.

+0

Wow, non sapevo che ci fossero molti dettagli su DateTime, +1, grazie! –

+3

@BaliC Aggiungo che se si è in "sport" di usare 'DateTime' per numerare i file, è consigliabile utilizzare' DateTime.UtcNow' in modo da non avere problemi con l'ora legale. – xanatos

2

Se è necessario il datetime per essere più precisi è possibile utilizzare:

DateTime.Now.ToString("O").Replace(":", "_") //2016-09-21T13_14_01.3624587+02_00 

o (se avete bisogno di un po 'meno)

DateTime.Now.ToString("s").Replace(":", "_") //2016-09-21T13_16_11 

Entrambi sono nomi di file validi e sono ordinabili.

È possibile creare un metodo di estensioni:

public static string ToFileName(this DateTime @this) 
{ 
    return @this.ToString("O").Replace(":", "_"); 
} 

E poi usare in questo modo:

var saveZipToFile = "output_" + DateTime.Now.ToFileName() + ".zip"; 

Il formato "s" non prende i fusi orari in considerazione e quindi i datetimes:

  • 2014-11-15T18: 32: 17 + 00: 00
  • 2014-11 -15T18: 32: 17 + 08: 00

formattato con "s" sono identiche.

Quindi, se i tuoi datetimes rappresentano fusi orari dirrerent mi consiglia di utilizzare "O" o utilizzando DateTime.UtcNow.