web-dev-qa-db-fra.com

Convertir DateTime.Now en un nom de fichier Windows valide

J'ai eu ce problème plusieurs fois et je viens d'utiliser une solution de contournement, mais j'ai pensé que je demanderais ici au cas où il y aurait une option plus facile. Quand j'ai une chaîne de DateTime.Now et je veux ensuite l'utiliser dans un nom de fichier que je ne peux pas parce que Windows n'autorise pas les caractères/et: dans les noms de fichiers, je dois aller les remplacer comme ceci:

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

Ce qui semble un peu compliqué, existe-t-il un moyen plus simple de le faire? Toutes suggestions très appréciées.

40
Bali C
 DateTime.Now.ToString("dd_MM_yyyy")
57
Royi Namir

Comme écrit par Samich, mais

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

Si vous ne me faites pas confiance, essayez de définir la culture sur new CultureInfo("ar-sa"); :-)

J'ajouterai que si vous détestez le monde, c'est la chose la plus précise à faire:

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

Il y a 19 chiffres dans DateTime.MaxValue.Ticks

Si vous détestez encore plus le monde:

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

Il y a 16 chiffres hexadécimaux dans DateTime.MaxValue.Ticks.

48
xanatos

Utilisez un modèle ToString:

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

Vous pouvez utiliser le format long de l'horodatage:

DateTime.Now.ToBinary()
2
BigMike

Si vous avez besoin que le datetime soit plus précis, vous pouvez utiliser:

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

ou (si vous en avez besoin un peu moins)

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

Les deux sont des noms de fichiers valides et sont triables.

Vous pouvez créer une méthode d'extensions:

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

Et puis utilisez-le comme ceci:

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

Le format "s" ne prend pas en compte les fuseaux horaires et donc les horaires:

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

formatés avec "s" sont identiques.

Donc, si vos heures représentent des fuseaux horaires dirrerent, je recommanderais d'utiliser "O" ou d'utiliser DateTime.UtcNow.

2
inwenis