Получить DateTime из FileName - PullRequest
1 голос
/ 11 июня 2019

У меня есть файл с именем test-2000_01_02-10_12_14.xml.

Как мне получить только дату из файла?

Мне удалось получить дату, если файл имеет это имя: 2000_01_02-10_12_14

с этим (b является StorageFile):

DateTime dateVal;
bool parsed = DateTime.TryParseExact(b.DisplayName, 
                       "yyyy_MM_dd-H_mm_ss", 
                        System.Globalization.CultureInfo.InvariantCulture, 
                        System.Globalization.DateTimeStyles.None, 
                        out dateVal);

Затем я попытался изменить yyyy_MM_dd-H_mm_ss на что-то подобное *-yyyy_MM-dd-H-mm_ss, но это не похоже на решение

Ответы [ 3 ]

2 голосов
/ 11 июня 2019

Существует множество способов сделать это, это действительно зависит от того, насколько регулярно называются ваши файлы - всегда ли какой-нибудь ненужный текст, сопровождаемый рекламой, а затем год?

РазместитьЕще 10 разных примеров, если вы хотите более индивидуальный совет.Вот способ, который вы опубликовали:

DateTime.TryParseExact(
  Path.GetFileNameWithoutExtension(b.DisplayName.Substring(b.DisplayName.IndexOf('-')+1)), 
  "yyyy_MM_dd-H_mm_ss", 
  System.Globalization.CultureInfo.InvariantCulture, 
  System.Globalization.DateTimeStyles.None, 
  out dateVal
);

При этом используется подстрока с одним аргументом (без длины), чтобы удалить все после первого дефиса до конца строки, и GetFileNameWithoutExtension, чтобы удалить.xml - это фактически превращает anythinghere-2000_01_01-00_00_00.xml в 2000_01_01-00_00_00, готовый к синтаксическому анализу

Я мог бы также пойти на вещь типа .Remove("last index of period"), но это немного запутанно, потому что вы должны вычесть начальный индексдефиса и т. д.

М.Дж.Вилль о разбиении на дефис также является хорошим - вы можете разделить, затем взять индексы [1] и [2] и соединиться, а затем снова объединиться для разбора ..

Наконец, не забывайте, что сам файл может иметь дату создания, которая уже является хорошим кандидатом на дату создания, а не имя файла (которое может быть искажено людьми), если он не был где-то передан и повторно-saved.Взгляните на свойство FileInfo.CreationTime для этого - https://docs.microsoft.com/en-us/dotnet/api/system.io.fileinfo?view=netframework-4.8

1 голос
/ 11 июня 2019

Сначала нам нужно извлечь (сопоставить) часть даты и времени из имени файла:

  using System.Text.RegularExpressions;

  ... 

  // Aggravated task: dots and minuses within file's name
  string source = @"bla-bla-bla-test.me-2000_01_02-10_12_14.xml";

  string datetime = Regex.Match(
    Path.GetFileNameWithoutExtension(source),
   "[0-9]{4}_[0-9]{2}_[0-9]{2}-[0-9]{2}_[0-9]{2}_[0-9]{2}$").Value;

Затем мы можем проанализировать его

  if (DateTime.TryParseExact(
        datetime,
       "yyyy_MM_dd-H_m_s",
        CultureInfo.InvariantCulture, 
        DateTimeStyles.AssumeLocal,
        out DateTime result) {
    // result is the parsed date
  }
  else {
    // File doesn't contain valid date and time
  }
0 голосов
/ 11 июня 2019

Я бы предложил вам использовать regular expression, предполагая, что имя вашего файла всегда будет соответствовать одному и тому же формату, что вы можете сделать примерно так:

var pattern = @"\d{4}_\d{2}_\d{2}-\d{2}_\d{2}_\d{2}";

var fileName = "test-2000_01_02-10_12_14.xml";

var match = new Regex(pattern);

var result = match.Match(fileName);

if (result.Success)
{
   DateTime.TryParseExact(result.Value,
                    "yyyy_MM_dd-HH_mm_ss",
                  System.Globalization.CultureInfo.InvariantCulture,
                  System.Globalization.DateTimeStyles.None,
                  out DateTime dateVal);
}
...