Разное

Powershell datetime: Get-Date (Microsoft.PowerShell.Utility) — PowerShell | Microsoft Docs

19.10.1972

Содержание

PowerShell — Дата и Время — saw-friendship

DateTime: The truth is out there…

Так, у меня есть 30 дней для оплаты штрафа. А какое сегодня число? Ой, а месяц-то какой? Кажется февраль… А год не високосный ли?

Да, наплевать! Есть же (Get-Date).AddDays(30) !!
Далее небольшая история и много примеров работы с классом [DateTime], которые вам обязательно пригодятся, раз вы сюда попали

Когда я только начинал изучать PowerShell, я увидел много интересных и непонятных вещей, но именно класс [DateTime] был самым непонятным, поэтому я долго пытался обходить его стороной. Наверное, это связано с тем, что для написания PowerShell скриптов какое-то время совсем необязательно знать что такое методы и функции, но [DateTime] просто заставляет в это погрузиться и оказывается, все не так сложно…


Языки программирования, которые я поверхностно изучал в институте, вероятно, позволяли пользоваться какими-то методами, создавать классы и т.д., но, вероятно, для этого нужно было написать очень много строк кода, и я не представлял, что когда-нибудь я смогу создавать небольшие программы без всяких компиляторов, студий и т.

д. так просто, что даже для простых задач, выполняемых мышкой, стало проще написать скрипт, чем действительно делать их мышкой.
Я думаю, что любую сущность надо прочувствовать. Я написал уже несколько десятков скриптов для ActiveDirectory, прежде чем смог сказать, что я знаю, что такое ActiveDirectory 🙂
В книгах и статьях можно найти разные объяснения про объекты, их свойства и методы. Что-то вроде следующего:
Есть дом — это объект, у него есть длина, ширина, высота — это свойства. У него есть и метод — звонок, нажми на звонок, и из дома вылетит…

Как-то не складно…
Так вот чтобы почувствовать что PowerShell — это ООП, почувствовать его мощь и попробовать понять что это такое и зачем это нужно в скриптовом языке, давайте обратимся за помощью к классу [DateTime]
В PowerShell есть много типов данных, проверить тип данных какого-то конкретного экземпляра можно с помощью метода GetType. Создадим переменную $Date и присвоим ей значение — текущую дату:

$Date = Get-Date

Убедимся что переменная $Date теперь представляет собой экземпляр класса [DateTime]

PS> $Date.
GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True DateTime System.ValueType PS>

Свойства:

Что бы просмотреть свойства объекта, можно передать его по конвейеру в командлет select

PS> $Date | select *


DisplayHint : DateTime
DateTime    : 17 июля 2017 г. 17:06:47
Date        : 17.07.2017 0:00:00
Day         : 17
DayOfWeek   : Monday
DayOfYear   : 198
Hour        : 17
Kind        : Local
Millisecond : 78
Minute      : 6
Month       : 7
Second      : 47
Ticks       : 636359080070781099
TimeOfDay   : 17:06:47.0781099
Year        : 2017



PS>

Теперь мы поняли, что то, что мы видим на выходе командлета Get-Date, это просто удобное представление времени, но на самом деле это не строка, а объект, у которого есть свойства и к этим свойствам можно обратиться через точку. Например:

PS> $Date. Date

17 июля 2017 г. 0:00:00


PS> $Date.DayOfWeek
Monday
PS>
PS>

Методы:

$Date | Get-Member

С помощью Get-Member (чаще я использую алиас gm), мы видим методы, применяемые к классам. Метод — это функция, которая может принимать на вход аргументы. Если сравнить это со свойствами, которые показаны выше, то можно заметить что свойство DayOfWeek не может принимать никакие аргументы, они здесь не нужны, т.к. это свойство просто выводит день недели. Методы отличаются от свойств тем, что они выполняют какие-то действия.

В данном случае у нас класс [DateTime], посмотрим его методы через Get-Member (результат довольно большой, показывать не буду, выполняйте сами). Сейчас нам нужны только методы, поэтому уточним запрос:

$Date | Get-Member -MemberType Method

Теперь мы видим только методы. Выберем какой-нибудь из них, например AddDays.
Из названия метода AddDays понятно, что можно «добавить день».

Аргументы для методов передаются в скобках и называются страшным словом «перегрузка», но поскольку методы не имеют именованных параметров, важно соблюдать порядок, в котором аргументы передаются.

Итак мы решили воспользоваться методом AddDays, а когда смотрели Get-Member, то в Definition видели «double value» (число с плавающей запятой, см. типы данных). Теперь мы знаем что через точку можем обратиться к свойствам и методам, но методам можно передавать аргументы в скобках. Значит так и напишем: Экземпляр класса (объект), точка, метод, аргумент в скобках. Аргументом у нас будет число «2»,

Попробуем:

PS> $Date.AddDays(2)

19 июля 2017 г. 17:06:47


PS>

Теперь нецелое отрицательное

PS> $Date.AddDays(-1.5)

16 июля 2017 г. 5:06:47


PS>

Отлично, мы отняли полтора дня!

Это можно использовать и в командлетах:

PS# Get-EventLog -LogName Security -After (Get-Date).AddDays(-1) -Newest 3

   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
     541 июл 17 18:05  SuccessA... Microsoft-Windows...         4801 Разблокирована рабочая станция. ...
     540 июл 17 17:28  SuccessA... Microsoft-Windows...         4800 Заблокирована рабочая станция....
     539 июл 17 16:12  SuccessA... Microsoft-Windows...         4801 Разблокирована рабочая станция....


PS#
PS# ls $env:USERPROFILE\Desktop | ? {$_.LastWriteTime -ge (Get-Date).AddDays(-1)}


    Каталог: C:\Users\User\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       17.07.2017      1:20                script2.1
-a----       16.07.2017     23:24           3234 script1.ps1
-a----       16.07.2017     23:16           1660 readme.txt


PS#

Во многих командлетах на вход принимается именно дата, причем дата может быть указана и в виде текста (правда лучше так не делать).

Убедимся, напишем простую функцию «When», принимающую на вход один аргумент (именованный параметр «Date»):

PS> Function When {
>> param(
>> [Parameter(Mandatory=$true)][DateTime]$Date
>> )
>>
>> $Date
>> }
PS>
PS>
PS>
PS>
PS> When -Date (Get-Date). AddDays(-1)

16 июля 2017 г. 18:56:34


PS>
PS>
PS> When -Date '06.16.2017 18:56:34'

16 июня 2017 г. 18:56:34


PS>

Несколько примеров создания объекта [DateTime]

В этом примере в целом все нормально, но если не указать какой-либо из параметров, то аргумент для параметра будет взят из текущей даты

Get-Date -Year 2017 -Month 12 -Day 06 -Hour 18 -Minute 55 -Second 0

Или тоже самое, но через сплаттинг

$param = @{
'Year'=2017;
'Month'=12;
'Day'=6;
'Hour'=18;
'Minute'=55;
'Second'=0
}
Get-Date @param

Через стандартное создание объекта с перегрузкой, выше я говорил, что в перегрузке методов важен порядок, поэтому если что-то упустить, то создание объекта завершится ошибкой, тем не менее, это хороший способ

New-Object DateTime (2017, 12, 06, 18, 55, 00)

Или так

[DateTime]::new(2017, 12, 06, 18, 55, 00)

Преобразование типа из string в datetime, (плохой метод)

[DateTime]'2017. 12.06 18:55:00'

Почему? Да потому что легко допустить ошибку, стоит нам написать дату так, как мы видим ее в пуске  Windows, если язык системы русский, то мы получим неправильное распознавание. Простой пример:

PS> [datetime]’12.07.2017 14:55:00′

7 декабря 2017 г. 14:55:00

PS>

Мы получили 7-е декабря! Это не по-русски 🙂 Поэтому предлагаю самый правильный вариант получения даты из string, он больше всего подходит для парсинга логов, потому что он позволяет не просто отдать строку на неконтролируемое преобразование, а задать шаблон по которому преобразование производить

[DateTime]::ParseExact('2017.12.06 18:55:00','yyyy.MM.dd HH:mm:ss',$null)

В русских форматах нам достаточно двух аргументов, третий тоже необходимо указать, но тут он равен $null (если работать в одной локальной системе), но если у нас разные системы на разных языках, мы можем заставить PowerShell выводить или принимать дату на любом языке. Нам придется чуть-чуть углубиться в еще один класс [System. Globalization.CultureInfo] или сокращенно [CultureInfo]
Третий аргумент отвечает за языковые особенности формата дат, а его тип «CultureInfo»

Текущая культура

PS> [CultureInfo]::CurrentCulture

LCID             Name             DisplayName
----             ----             -----------
1049             ru-RU            Русский (Россия)


PS>

Американская культура

PS> [CultureInfo]::GetCultureInfo('en-US')

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            Английский (США)                                                                                                                                         


PS>

Выведем дату в американском формате

PS> (Get-Date).ToString([CultureInfo]::GetCultureInfo('en-US'))
7/18/2017 3:27:35 PM
PS>

А теперь преобразуем строку с полученной выше датой обратно в объект

PS> $str = (Get-Date). ToString([cultureinfo]::GetCultureInfo('en-US'))
PS>
PS> $str
7/18/2017 3:30:40 PM
PS>
PS>
PS> [datetime]::ParseExact($str, 'M/d/yyyy h:m:s tt', [cultureinfo]::GetCultureInfo('en-US'))

18 июля 2017 г. 15:30:40


PS>

Сравнение:

В скриптах нам часто требуется сравнивать две даты между собой или сортировать по дате. PowerShell позволяет сравнивать даты как будто это числа (хотя так оно, конечно, и есть).

Обращаю внимание на то, что заключаю командлет в скобки для того, чтобы как в математике, сначала выполнять операцию в скобках, ведь очевидно, что нельзя один командлет вычесть из другого, но их результаты — это уже конкретные значения, над которыми можно проводить операции вычитания, сложения и т.д..

Убедимся:

PS> (Get-Date) -lt (Get-Date).AddSeconds(1)
True
PS>
PS>
PS> (Get-Date) -gt (Get-Date).AddSeconds(1)
False
PS>
PS>

Сортировка:

PS> 1..3 | % {[DateTime]::new(2017, 12, 06, 18, 55, $_)} | Sort-Object -Descending

6 декабря 2017 г.  18:55:03
6 декабря 2017 г. 18:55:02
6 декабря 2017 г. 18:55:01


PS>

Вычитание дат:

В жизни мы иногда задаемся вопросом: «Сколько же с тех пор времени прошло?», и даже не верится, что в PowerShell такую операцию можно совершить с помощью знака минус, но как бы это ни казалось чудом, это возможно 🙂
Результатом вычитания двух дат будет объект класса [TimeSpan] (следует понимать как временной интервал)

PS> (Get-Date) - (Get-Date).AddDays(-3)


Days              : 3
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 0
Ticks             : 2592000000000
TotalDays         : 3
TotalHours        : 72
TotalMinutes      : 4320
TotalSeconds      : 259200
TotalMilliseconds : 259200000



PS>

Кстати убедимся, что это действительно [TimeSpan]

PS> $TimeSpan = (Get-Date) - (Get-Date).AddDays(-3)
PS> $TimeSpan.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     TimeSpan                                 System. ValueType


PS>

А теперь самое интересное: две даты конечно сложить нельзя, но к дате можно прибавить TimeSpan

PS> (Get-Date) + $TimeSpan

21 июля 2017 г. 1:15:33


PS>

Причем к TimeSpan нельзя прибавить дату, это не совсем математика, от перестановки слагаемых вы получите ошибку. Это вызвано невозможностью преобразования типа данных.

Создать объект класса TimeSpan можно несколькими способами, вот 3 варианта на выбор:

[TimeSpan]::new(0,1,0,0,0)
New-Object TimeSpan (0,1,0,0,0)
[TimeSpan]::FromHours(1)

Как видим, результат один и тот же:

PS> $Date + [TimeSpan]::new(0,1,0,0,0)

17 июля 2017 г. 18:06:47


PS>
PS> $Date + (New-Object TimeSpan (0,1,0,0,0) )

17 июля 2017 г. 18:06:47


PS>
PS> $Date + [TimeSpan]::FromHours(1)

17 июля 2017 г. 18:06:47


PS>

Форматирование

Нам потребуется метод ToString

Сначала несколько слов в продолжение о TimeSpan,  по умолчанию TimeSpan форматирует вывод следующим образом:

PS> $TimeSpan = [TimeSpan]::new(0,3,0,0,0)
PS> $TimeSpan. ToString()
03:00:00
PS>
PS>
PS> $TimeSpan = [TimeSpan]::new(1,3,0,0,0)
PS> $TimeSpan.ToString()
1.03:00:00
PS>

Видим неприятный момент, если TimeSpan меньше одного дня, то день вообще не попадает в вывод, у нас есть возможность указать свой формат, но лучше заранее знать разрядность количества дней. Для этого мы должны передать методу ToString аргумент в виде строки (примеры тут):

PS> $TimeSpan.ToString('dd\.hh\:mm\:ss')
01.03:00:00
PS>
PS> $TimeSpan.ToString('ddd\.hh\:mm\:ss')
001.03:00:00
PS>

Можно вставлять любые символы, но их обязательно нужно экранировать с помощью «\» (backslash)

PS> $TimeSpan.ToString('\d\:ddd\.\h\:hh\.\m\:mm\.\s\:ss')
d:001.h:03.m:00.s:00
PS>
PS>

Вернемся к DateTime, мы уже видели пример работы метода ToString, где аргументом у нас служил объект CultureInfo, но надо сказать, что никто не загоняет вас в рамки, аргументом может служить и строка.

Пожалуйста:

PS> (Get-Date). ToString('ddd, dd.MM.yyyy')
Вт, 18.07.2017
PS>
PS> (Get-Date).ToString('ddd, dd.MM.yyyy', [cultureinfo]::GetCultureInfo('en-US'))
Tue, 18.07.2017
PS>

Или так:

PS> (Get-Date).ToString('hh:mm, ddd, dd MMM yyyy')
03:46, Вт, 18 июл 2017
PS>
PS>
PS> (Get-Date).ToString('hh:mm tt, ddd, dd MMM yyyy', [cultureinfo]::GetCultureInfo('en-US'))
03:46 PM, Tue, 18 Jul 2017
PS>

На последок бонус)))
Метод определения дней в месяце и проверки високосного года

PS> [DateTime]::DaysInMonth(2017,07)
31
PS>
PS> [DateTime]::IsLeapYear(2016)
True
PS>

На этом все. Этой темы мы еще будем касаться, а пока можете попробовать придумать как рассчитать ваш возраст. В одной из следующих статей я расскажу вам о том, как решал ее я.

# ——————-
Статья написана после анализа интересов людей, пытающихся найти помощь по PowerShell в интернете. Больше всего кликов было на один из моих первых постов, который представлял собой маленький черновик по [DateTime] с примерами и особо без объяснений 🙂

Понравилось это:

Нравится Загрузка. ..

Get-Date — примеры работы с датой в Powershell

 

Get-Date возвращает в Powershell дату и время.  С помощью этого командлета мы можем получить нужное нам значение формата Datetime, что поможет нам выполнять, например, сравнение дат.

Т.е. выполнение команды без ключей вернет нам текущую дату в powershell:


Get-Date

Если нам нужно получить какую-то другую дату формата Datetime, то надо установить ее с помощью этого команды:


Get-Date -Year 2030 -Month 8 -Day 9 -Hour 10 -Minute 11 -Second 12

Если мы не установим какое-то значение, например Year (год), то он возьмется текущий.

 

Получим свойства и методы этого объекта:


Get-Date | Get-Member

 

Все методы — это то что мы можем сделать с датой. Для примера получим дату минус один день от сегодняшнего числа:


(Get-Date).AddDays(-1)

Или прибавить дни через AddDays:


$result = (Get-Date).AddDays(365)

Если мы прибавим, допустим, часы больше чем в сутках, то у нас изменится и день:


$result = (Get-Date).AddHours(30)

Таким же образом мы можем добавлять и убирать такие элементы дат:

  • AddDays — дни
  • AddHours — часы
  • AddMilliseconds — миллисекунды
  • AddMinutes — минуты
  • AddMonths — месяца
  • AddSeconds — секунды
  • AddYears — года

 

Так же как и во всех других языках мы можем преобразовать тип даты. Для того что бы преобразовать в строку у нас есть несколько методов:

  • ToLongDateString — строка с днем недели и именем месяца
  • ToLongTimeString — показывает часы, минуты и время
  • ToShortDateString — возвращает только дату
  • ToShortTimeString — вернет только часы и минуты
  • ToString — вернут полную дату и время

Каждый из этих методов вызывается так:


(Get-Date). ToLongDateString()

Или на примере какой-то другой даты с переменной:


$yesterday = Get-Date -Month 6 -Year 2225
$yesterday.ToLongDateString()

Для того что бы получить дату из строки  нужно использовать ключ date:


Get-Date -Date "1/1/2019"

Если мы не установим время или дату, то значение возьмется текущее:


Get-Date -Date "10:15"

Нужно учитывать, что формат даты в таком варианте исполнения будет тем, который установлен в системных настройках. В моем случае американский и поэтому идет месяц, день, год. Если стоит русский будет день, месяц и год. Увидеть эту настройку можно так:


Get-WinSystemLocale

 

Возможно получить только день недели или час от времени и для этого нужно использовать Format или один из методов. Так я получу год:


Get-Date -Format "yyyy"

Или аналогично, но уже используя свойство:


(Get-Date).year

Используя Format всегда возвращается тип данных string, а не DateTime.

У нас есть еще множество свойств, кроме Year, которые мы можем получать:

Выведем день недели ( DayOfWeek):


(Get-Date).DayOfWeek

Обратите внимание, что не всегда возвращаемый объект типа DateTime. Он может быть и численным (int) или строковым, в случае с Format.

На примере Format есть много спецификаторов:

  • dddd — день недели в виде имени
  • MM — номер месяца
  • dd — день месяца
  • yyyy — год
  • HH:mm — часы и минуты
  • K — Часовой пояс
  • ss — секунды

Так мы выведем дату формата часы, минуты, день, месяц и год:


Get-Date -Format "HH:mm dd/MM/yyyy"

Обращаете внимание на регистр иначе получим другие значение.

 

Выполнять сравнение дат можно в случае, если значение типа DateTime. Какого типа значение мы можем посмотреть двумя способами. При просмотра свойства объекта мы увидим какого типа он возвращает значение:


Get-ChildItem | Get-Member | Where-Object -Property Definition -Like "*datetime*"

Либо у получить это значение так:


(Get-Date).GetType()

Для примера сравним в powershell даты файла. На картинке выше видно, что у каждого файла есть свойство CreationTime формата DateTime. Сравним какие файлы были созданы за последние 15 дней:


Get-ChildItem -Path ".\Folder2\" | where -Property CreationTime -GT (Get-Date).AddDays(-15)

GT — говорит о том, что мы ищем значения только больше чем справа. Обо всех операторах сравнения мы говорили тут. 

Мы можем сравнивать и только по дню месяца, но в случае ниже день месяца будет числом, а не датой:


Get-ChildItem -Path C:\Folder2\ | Where-Object {$_.CreationTime.Day -eq (Get-Date).Day}

Командлет Get-ChildItem мы рассматривали тут.

 

Один из интересных примеров в работе с датой это командлет New-TimeSpan, который вернет время работы сервиса или любого другого объекта, если передать ему время. Для примера так он вернет значение в минутах, секундах с установленной даты:


New-TimeSpan -Start (Get-Date).AddDays(-15)

Применение этому можно найти, например, открытым пользователями через SMB файлам или очень долго запущенным процессам. 

На примере процессов:

Теги: #powershell

PowerShell 🚀 — Get-Date -FromUnixTime должен поддерживать отрицательные значения.

Краткое описание новой функции / улучшения

PR # 12179 добавил параметр FromUnixTime в команду Get-Date.
В PowerShell 7.1.0-preview.3 следующая команда вызывает ошибку.

PS /> Get-Date -Date -1 -FromUnixTime
Get-Date: Cannot bind parameter 'Date'. Cannot convert value "-1" to type "System. DateTime". Error: "String '-1' was not recognized as a valid DateTime."

Эта команда должна поддерживать отрицательное время unix.

В Ubuntu следующие команды не возвращают ошибку.

$ date --date "@-1"
Wed Dec 31 23:59:59 UTC 1969

Предлагаемые детали технической реализации (необязательно)

Параметр Date команды Get-Date имеет тип DateTime . Если этому параметру передается целочисленное значение, оно будет интерпретировано как тики . Это должно быть положительное значение.

Другими словами, следующий код недействителен.

PS /> [datetime] -1
InvalidArgument: Cannot convert value "-1" to type "System.DateTime". Error: "Ticks must be between DateTime.MinValue.Ticks and DateTime.MaxValue.Ticks. (Parameter 'ticks')"

Время Unix может принимать отрицательное значение, что означает, что оно предшествует эпохе Unix.

Чтобы параметр Date мог принимать отрицательное целое число, необходимо изменить тип этого параметра на long.
Но это переломное изменение.

Я думаю, что параметр FromUnixTime должен иметь возможность принимать значение, как было предложено в # 11719 .

Area-Cmdlets-Utility Issue-Question Resolution-Fixed

Отображение объектов TimeSpan с использованием композитного форматирования – Hey, Scripting Guy! Blog — sergey vasin

Резюме: Используем Windows PowerShell и возможности композитного форматирования для работы с объектами TimeSpan.

Объект TimeSpan представляет из себя промежуток времени между некоторыми двумя моментами. Например, если мы попробуем выяснить величину временного промежутка между 14 марта 2013 года и 12 марта 2013 года, результатом станет объект типа TimeSpan.

PS C:\> [datetime]»3/14/13″ -[datetime]»3/12/13″

Days : 2

Hours : 0

Minutes : 0

Seconds : 0

Milliseconds : 0

Ticks : 1728000000000

TotalDays : 2

TotalHours : 48

TotalMinutes : 2880

TotalSeconds : 172800

TotalMilliseconds : 172800000

Заметка: Это пятая статья в серии постов о методах и операторах форматирования в Windows PowerShell.

Отображение объекта TimeSpan по умолчанию

По умолчанию Windows PowerShell отображает все свойства объекта TimeSpan. Как вы можете видеть в предыдущем примере – вывод получается достаточно сумбурный. Но это не проблема, если я работаю интерактивно и моя цель – всего лишь узнать величину промежутка времени между двумя моментами во времени.

Передав объект командлету Get-Member мы получим список его свойств.

[datetime]»3/14/13″ -[datetime]»3/12/13″ | Get-Member -MemberType *property

Команда и ее вывод представлены на рисунке.

Таким образом, если мне нужно узнать количество часов между значениями двух объектов DateTime, мне придется сначала получить имя нужного свойства (воспользовавшись командлетом Get-Member, либо просто запустив команду и изучив ее вывод). Pатем я смогу получить значение свойства, поместив команду в скобки и указав его имя.

PS C:\> ([datetime]»3/14/13″ -[datetime]»3/12/13″).totalhours

48

Обычно я использую этот подход, когда мне нужно получить значение определенного свойства объекта TimeSpan. Однако есть более удобный способ представить объект в том виде, который мне нужен.

Используем определители стандартных форматов объектов TimeSpan

Самый простой способ использовать определители форматов TimeSpan – это композитное форматирование. Для объектов TimeSpan существует три стандартных формата. Они представлены в таблице.

Format SpecifierName
  “c”  Constant format (not culture sensitive.[-]d.hh:mm:ss.[fffffff]
  “g”  General short format (culture sensitive)[-]d.hh:mm:ss.[fffffff]
  “G”  General long format (culture sensitive)[-]d.:hh:mm:ss.fffffff

Заметка: Подробную документацию по определителям стандартных форматов объектов TimeSpan вы можете найти в статье Standard TimeSpan Format Strings на сайте MSDN.

Пример использования этих форматов приведен на рисунке.

Заметка: Более полную информацию о композитном форматировании вы можете найти в статье Composite Formatting на сайте MSDN.

Пример 1. Используем статический метод WriteLine

Для того, чтобы задать формат вывода объекта TimeSpan при помощи статического метода WriteLine класса .NET Framework System.Console, мне нужно указать строку, которую я хочу вывести и элемент форматирования, содержащий определитель формата “c”. “c” – это определитель формата, не зависящего от региональных настроек компьютера. То есть, при его использовании, вывод объекта TimeSpan всегда будет одним и тем же. В качестве второго параметра метода WriteLine я укажу объект TimeSpan. Код и его вывод приведен ниже.

PS C:\> $ts = [datetime]»3/14/13″ -[datetime]»3/12/13″

PS C:\> [console]::WriteLine(«The lapsed time is: {0:c}», $ts)

The lapsed time is: 2.00:00:00

Пример 2. Используем оператор форматирования Windows PowerShell

Для того, чтобы воспользоваться определителем формата объекта TimeSpan с оператором форматирования Windows PowerShell, с левой стороны от оператора задайте строку и добавьте элемент форматирования, содержащий требуемый определитель формата. Справа от него укажите нужный объект TimeSpan.

PS C:\> $ts = [datetime]»3/14/13″ -[datetime]»3/12/13″

PS C:\> «The lapsed time is: {0:g}» -f $ts

The lapsed time is: 2:0:00:00

Пример 3. Выводим объект TimeSpan с отображением миллисекунд

Одно из полезный свойств определителей формата “c” и “g”, это то, что они отображают те части объекта, которые существуют. Таким образом, если объект TimeSpan не содержит дней, при выводе часть, определяющая дни, будет отсутствовать. Если в объекте определены миллисекунды, они будут выведены.

В приведенном ниже скрипте я сохраняю текущее значение даты и времени в переменной. Далее я ожидаю некоторое время и сохраняю еще один объект DateTime во второй переменной. Затем я создаю объект TimeSpan, представляющий из себя разницу между двумя объектами DateTime. После этого я использую оператор форматирования Windows PowerShell для отображения объекта TimeSpan в коротком формате, в соответствии с текущими региональными настройками компьютера. Поскольку обе переменные относятся к одному и тому же дню, часть объекта TimeSpan определяющая дни не отображается.

PS C:\> $now = get-date

PS C:\> $later = get-date

PS C:\> $nts = New-TimeSpan -Start $now -End $later

PS C:\> «The timespan is {0:g}» -f $nts

The time span is 0:09:03.1051821

Этот же самый подход приведен на рисунке ниже. На нем отображены результаты использования всех трех стандартных форматов объекта TimeSpan.

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2013/03/15/use-powershell-and-conditional-formatting-to-format-time-spans.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Демистифицируя даты, DateTime и форматирование PowerShell

PowerShell может делать много вещей, и, как любой хороший язык программирования, он может делать с датами все, что угодно. Используя команду PowerShell Get-Date и другие методы, вы можете найти сегодняшнюю дату, завтрашнюю дату, форматировать даты и многое другое.

Из этой статьи вы узнаете все о датах и ​​PowerShell!

Предварительные требования

Чтобы следовать примерам из этой статьи, убедитесь, что у вас есть следующие предварительные условия, которые выполнены заранее:

  • Windows PowerShell v5 или более поздней версии. Даже если вы используете более раннюю версию, все примеры, вероятно, будут работать нормально.

Определение текущей даты с помощью PowerShell

Один из самых простых способов узнать текущую дату с помощью PowerShell — использовать командлет Get-Date . Эта команда отображает текущую дату и время, как показано ниже.

  PS> Дата получения
22 ноября 2020 г. 1:25:57
  

По умолчанию Get-Date выглядит так, будто возвращает только текущую дату и время, но на самом деле возвращает гораздо больше информации.Чтобы найти эту информацию, передайте выходные данные командлету Format-List , как показано ниже.

  PS> Дата получения | Формат-Список
DisplayHint: DateTime
Дата: 22.11.2020 00:00:00
День: 22
DayOfWeek: воскресенье
DayOfYear: 327
Час: 1
Вид: Местный
Миллисекунда: 163
Минуты: 26
Месяц: 11
Второй: 2
Кики: 637416051621635773
TimeOfDay: 01: 26: 02.1635773
Год: 2020
Дата и время: 22 ноября 2020 г., воскресенье, 1:26:02
  

Вы также можете использовать командлет Get-Member , чтобы найти все свойства объекта, запустив Get-Date | Get-Member -MemberType Properties также.

Если вы проверите тип объекта, который возвращает Get-Date , вы заметите, что это тип объекта System.DateTime . Этот класс предоставляет все различные свойства и методы, которые вы видите. Вы можете узнать тип этого объекта, используя Get-Member или GetType () , как показано ниже.

  PS> (Get-Date) .GetType (). FullName
System.DateTime
  

Когда вы увидите все доступные свойства, вы можете ссылаться на них, используя точечную нотацию, как показано ниже.

  PS> (Дата получения). Год
2020 г.

PS> (Get-Date) .DayOfWeek
Воскресенье

PS> (Get-Date) .Month
11

PS> (Get-Date) .DayOfYear
327
  

Точечная нотация кажется вам слишком «девственной»? Если это так, вы также можете использовать параметр DisplayHint для достижения того же результата.

  PS> Get-Date -DisplayHint Date
Воскресенье, 22 ноября 2020 г.

PS> Get-Date -DisplayHint Время
2:29:35 утра

PS> Get-Date -DisplayHint DateTime
22 ноября 2020 г. 2:29:39
  

Использование Get-Date — это самый простой способ найти текущую дату и различные атрибуты, но вы можете сделать гораздо больше!

Арифметика даты с PowerShell

Допустим, вам нужно знать дату и / или время определенного количества дней, лет или минут в прошлом или будущем.Вы можете найти эту информацию, используя методы.

Использование методов

DateTime

Объект System.DateTime , который возвращает Get-Date , имеет различные методы, которые можно вызывать для добавления или удаления отрезков времени. Если вы запустите Get-Date | Get-Member , вы увидите различные методы, которые начинаются с Добавить .

  AddDays Метод datetime AddDays (двойное значение)
AddHours Метод datetime AddHours (двойное значение)
AddMilliseconds Метод datetime AddMilliseconds (двойное значение)
AddMinutes Метод datetime AddMinutes (двойное значение)
AddMonths Метод datetime AddMonths (целые месяцы)
AddSeconds Метод datetime AddSeconds (двойное значение)
AddTicks Метод datetime AddTicks (длинное значение)
AddYears Метод datetime AddYears (значение типа int)
  

Вы можете вызвать каждый из этих методов, чтобы найти дату / время в будущем или в прошлом.Ниже вы увидите несколько примеров вызова каждого из этих методов и их результатов.

  # Добавление 8 дней к текущей дате
PS> (Get-Date) .AddDays (8)
30 ноября 2020 г. 1:59:39

# Добавляем 3 часа к текущему времени
PS> (Get-Date) .AddHours (3)
22 ноября 2020 г. 4:59:51

# Добавление пяти лет к текущей дате
PS> (Get-Date) .AddYears (5)
Суббота, 22 ноября 2025 г., 2:00:11

# Вычитание 8 дней из текущей даты с использованием отрицательного числа.
PS> (Get-Date).AddDays (-8)
Суббота, 14 ноября 2020 г., 2:02:43
  

Использование

New-Timespan

Что, если бы вы хотели узнать разницу между двумя датами; а не просто добавление определенного количества временных отрезков? Один из способов сделать это — использовать командлет New-Timespan . Командлет New-Timespan создает объектов TimeSpan , которые представляют разницу даты / времени или интервалы.

Используйте командлет New-TimeSpan , указав дату / время Start и End в качестве параметров.Например, если вы хотите найти разницу между 23 ноября 2020 г. в полночь и 31 декабря 2020 г. в полночь, вы можете использовать следующий фрагмент кода.

Используя объекты TimeSpan , вы можете найти разницу даты / времени практически с любым приращением, которое вам нужно.

  PS> $ StartDate = Get-Date -Month 11 -Day 23 -Year 2020 -Hour 00 -Minute 00 -Second 00
PS> $ EndDate = Get-Date -Month 12 -Day 31-Year 2020 -Hour 00 -Minute 00 -Second 00
PS> $ StartDate
Понедельник, 23 ноября 2020 г., 00:00:00

PS> $ EndDate
Четверг, 31 декабря 2020 г., 00:00:00

PS> New-TimeSpan -Start $ StartDate -End $ EndDate

Дней: 38
Часы: 0
Минут: 0
Секунды: 0
Миллисекунды: 672
Тики: 32832006722080
Всего дней: 38.0000077801852
Полный час: 912.000186724444
Всего минут: 54720.0112034667
Всего секунд: 3283200.672208
TotalMilliseconds: 3283200672.208
  

Сравнение дат

Вы можете не только найти различия в дате и времени, но и сравнить их с помощью стандартных операторов PowerShell. PowerShell знает, когда дата «меньше» (раньше) или «больше» (позже) другой даты.

Для сравнения дат просто создайте два объекта DateTime , используя Get-Date или, возможно, преобразовав строки с [DateTime] , а затем используя стандартные операторы PowerShell, такие как lt или gt .

Ниже вы можете увидеть простой пример сравнения дат.

  # Объявление даты
PS> $ Date1 = (Get-Date -Month 11 -Day 14-Year 2020)
PS> $ Date2 = Get-Date
PS> $ Date1 -lt $ Date2
Истинный
  

Преобразование (преобразование) строк в объекты DateTime

PowerShell также может отображать даты в различных форматах. Например, предположим, что у вас есть файл CSV или электронная таблица с различными датами, определенными в формате, который вы видите ниже в столбце date_time_utc .В настоящее время используется формат ГГГГ-ММ-ДДTчч: мм: сс.0000000Z .

Вы хотите проанализировать этот файл и найти все строки с датой семи дней или старше.

Пример формата даты

PowerShell по умолчанию не знает, что 2020-09-07T13: 35: 08.4780000Z — это дата и время; он просто думает, что это простая строка. Чтобы PowerShell понял, вы должны сначала преобразовать его в объект DateTime , например, Get-Date , возвращаемый.

Чтобы преобразовать строку в объект DateTime , перед строкой (или переменной) укажите [DateTime] .Когда вы это делаете, PowerShell пытается интерпретировать строку как дату и время, а затем предоставляет вам все свойства и методы, доступные для этого типа объекта.

  PS> $ Date = "2020-09-07T13: 35: 08.4780000Z"
PS> [DateTime] $ Date
Понедельник, 7 сентября 2020 г., 13:35:08
  

Форматирование даты PowerShell

Теперь, когда вы знаете об основных методах использования дат, пора глубже погрузиться в тему. Давайте еще немного поиграем, используя разные форматы для отображения дат.

Всякий раз, когда вы запускаете Get-Date , вы увидите вывод вроде Monday, September 7, 2020 13:35:08 PM . Эти выходные данные фактически представляют собой объект DateTime со свойствами и методами; не простая строка. Но вы можете преобразовать этот объект DateTime в строку и представить его по-разному, используя различные методы форматирования даты.

DateTime Методы

Один из способов изменить способ отображения объекта DateTime — использовать методы объекта DateTime .Объект DateTime имеет четыре метода, которые можно использовать для изменения форматирования:

  • ToLongDateString ()
  • ToShortDateString ()
  • ToLongTimeString ()
  • ToShortTimeString ()
9000Tring ( 9000Tring) Вы можете увидеть пример использования String () методы ниже.

  PS> [DateTime] $ Date = $ Date
PS> $ date.ToShortDateString () + "" + $ date.ToShortTimeString ()
07.09.2020 19:05
  

Формат

Параметр

Один из способов изменить формат даты объекта DateTime - использовать Get-Date для создания объекта и параметр Format для изменения формата. Параметр Format принимает строку символов, каждый из которых представляет, как должна выглядеть строка даты / времени.

Вы можете увидеть несколько примеров символов, которые можно использовать с параметром Формат .

  # Для отображения полного шаблона даты с коротким шаблоном времени
PS> Get-Date -Format f
22 ноября 2020 г. 4:26

# Для отображения полного шаблона даты с длинным шаблоном времени
PS> Get-Date -Format F
22 ноября 2020 г. 4:26:31

# Для отображения шаблона короткой даты
PS> Get-Date -Format d
22.11.2020

# Для отображения длинного шаблона даты
PS> Get-Date -Format D
Воскресенье, 22 ноября 2020 г.

# Год месяц шаблон
PS> Get-Date -Format Y
Ноябрь 2020

## Объединение символов формата
PS> Get-Date -Format "dddd dd-MM-yyyy HH: mm K"
Воскресенье 22-11-2020 03:41 +05: 30
  

Ознакомьтесь с документацией Microsoft, чтобы получить полную разбивку всех символов, которые вы можете использовать с параметром Format .

Как только вы используете параметр Format , вы увидите, что Get-Date больше не возвращает объект DateTime , а теперь представляет собой строку.

  PS> (Get-Date -Format D) .GetType (). FullName
System.String
  

UFormat Параметр

Подобно параметру Format , у вас также есть параметр UFormat с командлетом Get-Date . Параметр UFormat позволяет определять форматы даты с помощью форматирования даты UNIX.

Параметр UFormat аналогичен параметру Формат в том, что вы можете комбинировать символы формата даты, чтобы изменить способ возврата даты в виде строки. Например, попробуйте следующие форматы и посмотрите, что вернули.

  PS> Get-Date -UFormat% A
PS> Get-Date -UFormat% b
PS> Get-Date -UFormat% B
  

Вы также можете комбинировать эти символы формата даты. В приведенном ниже фрагменте кода используются символы d , m и Y для возврата даты в формате дд-мм-гггг, а использует символ r для возврата времени в 12-часовом формате с использованием часовой пояс т симв.

  PS> Get-Date -UFormat "% d-% m-% Y% r% Z"
22-11-2020 18:10:55 +05
  

Ознакомьтесь с документацией Microsoft, чтобы получить полную разбивку всех символов, которые вы можете использовать с параметром UFormat .

Как отформатировать DateTime в PowerShell

Как отформатировать DateTime в PowerShell - qaru

Присоединяйтесь к Stack Overflow , чтобы учиться, делиться знаниями и строить свою карьеру.

Спросил

Просмотрено 549k раз

Я могу без проблем отформатировать командлет Get-Date :

  $ date = Get-Date -format "ггггММдд"
  

Но если у меня есть дата в переменной, как мне ее отформатировать? Выписка ниже

  $ dateStr = $ date -format "гггММдд"
  

возвращает эту ошибку:

"Вы должны предоставить выражение значения в правой части "-f" оператор "

"
Питер Мортенсен

28.6k2121 золотой знак9595 серебряных знаков123123 бронзовых знака

Создан 12 фев.

Ev.Ev.

6,33

  • золотых знаков4949 серебряных знаков8484 бронзовых знака

    2

    То же, что и в.НЕТТО:

      $ DateStr = $ Date.ToString ("ггггММдд")
      

    или:

      $ DateStr = '{0: yyyyMMdd}' -f $ Date
      
  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *