Парсинг дат та часу, PowerShell та інші скрипти.
Get-Command Out-Blog
Парсинг дат та часу
Практично всі значення дат і часу PowerShell представлені у вигляді DateTime. Це клас .Net, що дозволяє легко порівнювати різні значення та проводити з ними різні операції.
Однак часто доводиться обробляти джерела даних, у яких значення часу представлені у вигляді простого тексту — наприклад, логи. І так вже склалося, що у різних розробників є різні погляди на те, як слід записувати час у текстовому вигляді. І тут постає питання - як розібрати цей рядок, і сконвертувати його в тип DateTime? У пості про оператор -replace я вже показував один із варіантів як це можна зробити. Але чесно кажучи, той спосіб дещо…. не "прямий". 😉 А проблема, що часто виникає. Тож я вирішив докладніше розглянути цю тему.
Почнемо з найпростішого. PowerShell (або .Net) може легко конвертувати текстовий рядок у тип DateTime, якщо час у цьому рядку написано у певному форматі. А точніше в американському, наприклад «2/22/2008 23:12:33.1233», коротше кажучи — «місяць/число/рік: хвилини: секунди. мілісекунди».
Що цікаво – це не залежить від регіональних налаштувань системи – за замовчуванням формат завжди американський. Так було зроблено для того, щоб скрипти працювали однаково на системах з будь-якими регіональними налаштуваннями.
Якщо все ж таки необхідно розібрати дату відповідно до регіональних налаштувань, то слід використовувати статичний метод Parse класу DateTime:
В обох випадках у рядку не обов'язково повинні бути присутніми всі елементи. Можна вказати лише дату, лише час, або, наприклад, не вказувати мілісекунди.
Як видно з прикладів, якщо не вказано дату, то буде підставленопоточний день, а у разі відсутності часу підставиться 0:00:00.
Ну і повернемося до початкового завдання. Як розібрати дату, якщо вона записана в якомусь іншому форматі. Тут знадобиться спосіб ParseExact (спасибі MoW за підказку 😉 ). Він дозволяє вказати будь-який формат для розбору рядка в дату.
Як перший параметр вказується рядок, що розбирається, а другий параметр - маска по якій відбуватиметься розбір. MM – означає 2 цифри місяця, dd – 2 цифри дня, yyyy – 4 цифри року, ss – секунди, mm – хвилини, HH – годинник у 24-годинному форматі (для 12 годинного використовується hh). Докладніше про можливі символи та їх значення можна прочитати тут. До речі, ще є можливість не вводити маску повністю самому, а використовувати зумовлені: