2011-10-24 19 views
36

He tenido este problema varias veces y acabo de utilizar una solución, pero pensé que podría preguntar aquí en caso de que haya una opción más fácil. Cuando tengo una cadena de DateTime.Now y luego quiero usar esto en un nombre de archivo no puedo porque Windows no permite los caracteres/y: en nombres de archivos, tengo que ir y reemplazarlos así:Convertir DateTime.Now a un nombre de archivo de Windows válido

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

¿Qué parece una molestia, hay una manera más fácil de hacer esto? Cualquier sugerencia muy apreciada.

+0

¿Se puede utilizar un patrón de estilo ISO8601 más lógico como 'yyyyMMdd'? – tenfour

Respuesta

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

Gracias Royi, ¡eso fue lo que hizo! –

+5

tenga en cuenta de la capital MM que es mes y no mm, que es minuto ... ¡muy importante! –

+1

Esto supone que el lenguaje no utiliza caracteres de nombre de archivo ilegales en su formato dd, MM o aaaa. Verdadero para inglés. No necesariamente es cierto para otros idiomas. –

8

utilizar un patrón ToString:

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

Tendrás que usar HH en lugar de hh o en lugar de 14 obtendrás 02 – xanatos

+0

Gracias, he actualizado la muestra. – Samich

2

Puede usar mucho el formato de fecha y hora:

DateTime.Now.ToBinary() 
39

Como escrito por Samich, pero

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

Si no' Confía en mí, intenta establecer la cultura en new CultureInfo("ar-sa"); :-)

voy a añadir que, si no le gusta el mundo, esto es lo más precisa hacer:

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

hay 19 dígitos en DateTime.MaxValue.Ticks

Si no te gusta el mundo aún más:

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

Hay 16 dígitos hexadecimales en DateTime.MaxValue.Ticks.

+0

Wow, no sabía que había tanto detalle en DateTime, +1, ¡gracias! –

+3

@BaliC Añadiré que si estás en el "deporte" de usar 'DateTime' para numerar tus archivos, probablemente deberías usar' DateTime.UtcNow' para que no tengas problemas con el horario de cambio de DST. – xanatos

2

Si necesita la fecha y hora para ser más precisos se puede utilizar:

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

o (si necesita un poco menos)

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

Ambos son nombres de archivo válidos y se pueden ordenar.

Puede crear un método de extensiones:

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

y luego usarlo como esto:

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

El formato de "s" no tiene zonas horarias en cuenta y por lo tanto los datetimes:

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

formateados con "s" son idénticos.

Por lo tanto, si su fecha y hora representan las diferentes zonas horarias dirrerent, le recomendaría usar "O" o usar DateTime.UtcNow.

Cuestiones relacionadas