Конвертуємо текст в дату за допомогою PowerShell.
Для представлення дати і часу в PowerShell використовується тип DateTime, що дозволяє порівнювати різні значення і між ними чинити різні дії. Але іноді необхідно обробити дані, що містять дату і час в звичайному текстовому форматі. Подібні операції доводиться виробляти, наприклад, при парсінгу логів додатків.
В цьому випадку доведеться попередньо конвертувати рядок тексту в тип DateTime. А оскільки різні додатки пишуть дату в логах в абсолютно різних, часом нестандартних форматах, то при їх обробці може виникнути проблема.
Найпростіше взяти вихідний рядок і явно вказати для неї тип даних, наприклад так:
[datetime] "07-13-2014 18:30:23"
Але тут є одна тонкість - дата повинна бути строго в певному форматі.Якщо точніше, то в американському (US), тобто виду MM/dd/yyyy HH: mm: ss.ffff (місяць/число/рік годинник: хвилини: секунди.міллісекунди). Це не залежить від поточних регіональних налаштувань системи, за замовчуванням формат DateTime завжди американський.
Можливо це було зроблено для того, щоб скрипти не залежали від регіональних налаштувань і однаково виконувалися на різних системах.Тому, якщо вихідна рядок не підходить під потрібний формат, то ми отримаємо або неправильний результат, або помилку.
Для розбору часу \ дати відповідно до регіональних настройками можна скористатися статичними методами .Net класу DateTime. Виведемо список статичних властивостей і методів командою:
[DateTime] | Get-Member -Static
Тут нас цікавлять методи Parse і ParseExact, призначені для парсинга дати, а також TryParse і TryParseExact - для перевірки валідності вхідних даних.
Примітка. Звичайні властивості і методи - це властивості і методи, що належать конкретному об'єкту, і для звернення до них необхідно спочатку цей об'єкт створити. Статичні ж властивості і методи не вимагають створення об'єкта для того, щоб працювати з ним.
Для розбору дати у відповідності з поточними регіональними настройками скористаємося методом parse:
[datetime] :: parse ( "13-07-2014 18:30:23")
Якщо ж дані представлені в форматі, відмінному від поточного, то можна скористатися методом parseexact.Для стандартних форматів дати \ часу можна вказати один з визначених типів, наприклад:
[datetime] :: parseexact ( '2014-07-13T18: 30: 23.3494995 + 04: 00`,' o ', $ null)
Якщо ж жоден зі стандартних форматів не підходить, то можна вказати маску, через яку здійснюватиметься розбір дати, наприклад так:
[datetime] :: parseexact ( ' 13072014-18 ~ 30 ~ 23`, 'ddMMyyyy-HH ~ mm ~ ss`, $ null)
Ну і якщо треба попередньо з'ясувати, чи містить рядок дані типу DateTime, то можна скористатися методами TryParse і TryParseExact.Для стандартних форматів підійде TryParse:
$ d = New-Object DateTime
[datetime] :: tryparse ('13 .07.2014 18: 30: 23`, [ref] $ d)
А для нестандартних - TryParseExact:
$ d = New-Object DateTime
[datetime] :: tryparseexact ( '130720014-18 ~ 30 ~ 23`,' ddMMyyyy-HH ~ mm ~ ss`, [System.Globalization.CultureInfo] :: InvariantCulture, [System.Globalization.DateTimestyles] :: None, [ref] $ d)
Ось як то так