文章目录
  • abstract
  • 获取当前日期和时间
  • 格式化日期和时间
  • 日期计算👺
  • 创建自定义日期和时间👺
  • **`[datetime]` 类型**及其构造函数
  • 缺省值
  • 计算日期差异
  • 获取特定部分的日期和时间
  • 比较日期和时间
  • 常用日期操作总结表
  • 时间间隔 TimeSpan 👺
  • 创建TimeSpan对象
  • 1. 使用`New-TimeSpan`命令
  • 2. 使用`[TimeSpan]`
  • 构造函数`new()`
  • 3. 通过字符串解析做类型转换
  • TimeSpan 属性
  • 常用操作
  • 1. 时间间隔相加减
  • 2. 时间间隔比较
  • 3. 转换为字符串
  • 示例总结
  • 用例案例
  • 触发器用例:在特定时间打开notepad
  • 步骤和命令
  • 完整命令示例
  • 注意事项


abstract

PowerShell 中处理日期和时间非常灵活且功能强大。下面是一些常用的日期和时间操作示例,帮助你更好地理解和使用这些功能。

获取当前日期和时间
# 获取当前日期和时间
$now = Get-Date
Write-Output $now
  • 1.
  • 2.
  • 3.
格式化日期和时间

可以通过 -Format 参数自定义日期和时间的格式。例如:

# 以自定义格式输出当前日期和时间
$now = Get-Date
$formattedDate = $now.ToString("yyyy-MM-dd HH:mm:ss")
Write-Output $formattedDate
  • 1.
  • 2.
  • 3.
  • 4.

常用的格式化字符串包括:

  • yyyy:四位数年份
  • MM:两位数月份
  • dd:两位数日期
  • HH:24小时制小时
  • mm:两位数分钟
  • ss:两位数秒
日期计算👺

可以对日期和时间进行加减操作。例如,获取7天后的日期:

# 计算7天后的日期
$futureDate = (Get-Date).AddDays(7)
Write-Output $futureDate
  • 1.
  • 2.
  • 3.
创建自定义日期和时间👺

可以使用 Get-Date 的参数来创建特定的日期和时间。例如:

# 创建一个自定义日期和时间
$customDate = Get-Date -Year 2023 -Month 12 -Day 25 -Hour 10 -Minute 30 -Second 0
Write-Output $customDate
  • 1.
  • 2.
  • 3.

使用类型转换获取日期对象:

 关于运算符[ ] - PowerShell | Microsoft Learn

$dt= [datetime]"2024-07-30 14:47:11"
write-host $dt
  • 1.
  • 2.

又比如

# $dt1= [datetime] '2/20/88'执行结果如下
PS [C:\Users\cxxu\Desktop]> $dt1= [datetime] '2/20/88'

PS [C:\Users\cxxu\Desktop]> $dt1

1988年2月20日 0:00:00
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

时间间隔计算和比较

[DateTime] '2/20/88' - [DateTime] '1/20/88' -eq [TimeSpan] '31'
  • 1.
[datetime] 类型及其构造函数
  • datetime 是 PowerShell 中用于表示日期和时间的类型。通过将字符串转换为 [datetime] 类型,可以将字符串解析为一个日期时间对象。
PS [C:\Users\cxxu\Desktop]> [datetime]::new

OverloadDefinitions
-------------------
datetime new(long ticks)
datetime new(long ticks, System.DateTimeKind kind)
datetime new(System.DateOnly date, System.TimeOnly time)
datetime new(System.DateOnly date, System.TimeOnly time, System.DateTimeKind kind)
datetime new(int year, int month, int day)
datetime new(int year, int month, int day, System.Globalization.Calendar calendar)
datetime new(int year, int month, int day, int hour, int minute, int second, int millisecond, System.Globalization.Calendar calendar, System.DateTimeKind
kind)
datetime new(int year, int month, int day, int hour, int minute, int second)
....
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

例如

PS [C:\Users\cxxu\Desktop]> [datetime]'11/11/11'

2011年11月11日 0:00:00
  • 1.
  • 2.
  • 3.
PS [C:\Users\cxxu\Desktop]> [datetime]::new(2011,11,11,11,11,11)

2011年11月11日 11:11:11
  • 1.
  • 2.
  • 3.

字符串格式

  • 字符串必须符合能够被解析为日期和时间的格式。常见格式包括 yyyy-MM-dd HH:mm:ssMM/dd/yyyy HH:mm:ss 等。

方法小结

方法

示例代码

[datetime] 类型转换

[datetime]$dateString

Get-Date cmdlet

Get-Date -Date $dateString

System.Globalization.DateTimeFormatInfo

[datetime]::ParseExact($dateString, $dateFormat, [System.Globalization.CultureInfo]::InvariantCulture)

这些方法可以帮助你将字符串转换为日期对象,根据具体需求选择合适的方法即可。

缺省值

创建datetime对象时,如果不是指定一个完整的’年-月-日 时:分:秒’,那么缺省的部分自动采集自当天(执行相关命令的当天)

假设我做此篇记录的时候是2024-7-30,那么有以下效果

PS C:\Users\cxxu\Desktop> [datetime]"20:16:11"

2024年7月30日 20:16:11

PS C:\Users\cxxu\Desktop> $time=Get-Date -Minute 52
PS C:\Users\cxxu\Desktop> $time

2024年7月30日 20:52:37

PS C:\Users\cxxu\Desktop> $time=Get-Date -Minute 52
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
计算日期差异

可以使用 [System.DateTime] 类型的方法来计算两个日期之间的差异。例如,计算两个日期之间的天数差异:

# 计算两个日期之间的天数差异
$startDate = Get-Date -Year 2023 -Month 1 -Day 1
$endDate = Get-Date -Year 2023 -Month 12 -Day 31
$daysDifference = ($endDate - $startDate).Days
Write-Output $daysDifference
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
获取特定部分的日期和时间

可以从日期和时间对象中提取特定部分,例如年、月、日、时、分、秒:

# 获取当前日期的年、月、日、时、分、秒
$now = Get-Date
$year = $now.Year
$month = $now.Month
$day = $now.Day
$hour = $now.Hour
$minute = $now.Minute
$second = $now.Second

Write-Output "Year: $year, Month: $month, Day: $day"
Write-Output "Hour: $hour, Minute: $minute, Second: $second"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
比较日期和时间

可以直接比较日期和时间对象。例如:

# 比较两个日期和时间
$date1 = Get-Date -Year 2023 -Month 1 -Day 1
$date2 = Get-Date -Year 2023 -Month 12 -Day 31

if ($date1 -lt $date2) {
    Write-Output "$date1 is earlier than $date2"
} else {
    Write-Output "$date1 is later than or equal to $date2"
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

常用日期操作总结表

操作

示例代码

获取当前日期和时间

Get-Date

自定义格式输出

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

日期加减

(Get-Date).AddDays(7)

创建自定义日期和时间

Get-Date -Year 2023 -Month 12 -Day 25 -Hour 10 -Minute 30

计算日期差异

($endDate - $startDate).Days

提取日期部分

$now.Year, $now.Month, $now.Day, $now.Hour, $now.Minute

比较日期和时间

$date1 -lt $date2

TimeSpan 是 .NET 和 PowerShell 中用于表示时间间隔(持续时间)的结构。它可以表示从几毫秒到几天的时间跨度。以下是对 TimeSpan 的详细介绍,包括其创建方法、属性和常用操作。

时间间隔 TimeSpan 👺

创建TimeSpan对象
1. 使用New-TimeSpan命令

可以使用 TimeSpan 的构造函数来创建时间间隔对象。构造函数有多种重载,最常用的是使用天、小时、分钟、秒和毫秒来初始化 TimeSpan 对象。

# 创建一个表示1天2小时30分钟45秒的TimeSpan对象
$timeSpan = New-TimeSpan -Days 1 -Hours 2 -Minutes 30 -Seconds 45
Write-Output $timeSpan
  • 1.
  • 2.
  • 3.
2. 使用[TimeSpan]
构造函数new()

查看[Timespan]对象的构造函数有多少种调用方法(一般用的较多的是第二种,即:timespan new(int hours, int minutes, int seconds)三个参数分别表示:时/分/秒)

PS [C:\Users\cxxu\Desktop]> [timespan]::new

OverloadDefinitions
-------------------
timespan new(long ticks)
timespan new(int hours, int minutes, int seconds)
timespan new(int days, int hours, int minutes, int seconds)
timespan new(int days, int hours, int minutes, int seconds, int milliseconds)
timespan new(int days, int hours, int minutes, int seconds, int milliseconds, int microseconds)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
# 创建一个表示3小时15分钟的TimeSpan对象
$timeSpan = [TimeSpan]::new(3, 15, 0)
Write-Output $timeSpan
  • 1.
  • 2.
  • 3.
PS [C:\Users\cxxu\Desktop]> $timeSpan = [TimeSpan]::new(3, 15, 0)

PS [C:\Users\cxxu\Desktop]> Write-Output $timeSpan

Days              : 0
Hours             : 3
Minutes           : 15
Seconds           : 0
Milliseconds      : 0
Ticks             : 117000000000
TotalDays         : 0.135416666666667
TotalHours        : 3.25
TotalMinutes      : 195
TotalSeconds      : 11700
TotalMilliseconds : 11700000
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
3. 通过字符串解析做类型转换

可以通过解析字符串来创建 TimeSpan 对象。

# 通过字符串解析创建TimeSpan对象
$timeSpan = [TimeSpan]::Parse("1:02:30:45")  # 格式为 "d:hh:mm:ss"
Write-Output $timeSpan
  • 1.
  • 2.
  • 3.

如果是仅仅指定(天/时/分/秒)中的一两项,则使用New-TimeSpan方法更加方便和具有可读性

TimeSpan 属性

TimeSpan 对象具有多个属性,可以获取其各个组成部分:

$timeSpan = New-TimeSpan -Days 1 -Hours 2 -Minutes 30 -Seconds 45

# 输出TimeSpan的各个属性
Write-Output "Days: $($timeSpan.Days)"
Write-Output "Hours: $($timeSpan.Hours)"
Write-Output "Minutes: $($timeSpan.Minutes)"
Write-Output "Seconds: $($timeSpan.Seconds)"
Write-Output "Milliseconds: $($timeSpan.Milliseconds)"
Write-Output "TotalDays: $($timeSpan.TotalDays)"
Write-Output "TotalHours: $($timeSpan.TotalHours)"
Write-Output "TotalMinutes: $($timeSpan.TotalMinutes)"
Write-Output "TotalSeconds: $($timeSpan.TotalSeconds)"
Write-Output "TotalMilliseconds: $($timeSpan.TotalMilliseconds)"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
常用操作
1. 时间间隔相加减

可以将两个 TimeSpan 对象相加或相减。

$timeSpan1 = New-TimeSpan -Hours 1 -Minutes 30
$timeSpan2 = New-TimeSpan -Minutes 45

# 相加
$resultAdd = $timeSpan1 + $timeSpan2
Write-Output "Addition: $resultAdd"

# 相减
$resultSubtract = $timeSpan1 - $timeSpan2
Write-Output "Subtraction: $resultSubtract"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
2. 时间间隔比较

可以比较两个 TimeSpan 对象的大小。

$timeSpan1 = New-TimeSpan -Hours 1
$timeSpan2 = New-TimeSpan -Minutes 45

if ($timeSpan1 -gt $timeSpan2) {
    Write-Output "$timeSpan1 is greater than $timeSpan2"
} elseif ($timeSpan1 -lt $timeSpan2) {
    Write-Output "$timeSpan1 is less than $timeSpan2"
} else {
    Write-Output "$timeSpan1 is equal to $timeSpan2"
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
3. 转换为字符串

可以将 TimeSpan 对象转换为字符串,便于显示或存储。

$timeSpan = New-TimeSpan -Days 1 -Hours 2 -Minutes 30 -Seconds 45
$timeSpanString = $timeSpan.ToString()
Write-Output $timeSpanString
  • 1.
  • 2.
  • 3.
PS [C:\Users\cxxu\Desktop]> Write-Output $timeSpanString
1.02:30:45
  • 1.
  • 2.
示例总结

以下是对 TimeSpan 操作的总结表:

操作

示例代码

创建 TimeSpan

New-TimeSpan -Days 1 -Hours 2 -Minutes 30 -Seconds 45

使用构造函数创建

[TimeSpan]::new(3, 15, 0)

通过字符串解析创建

[TimeSpan]::Parse("1:02:30:45")

获取属性

$timeSpan.Days, $timeSpan.Hours, $timeSpan.TotalMinutes

时间间隔相加减

$timeSpan1 + $timeSpan2, $timeSpan1 - $timeSpan2

时间间隔比较

$timeSpan1 -gt $timeSpan2, $timeSpan1 -lt $timeSpan2

转换为字符串

$timeSpan.ToString()

通过这些示例,你可以更好地理解和使用 PowerShell 中的 TimeSpan 对象来处理时间间隔。如果有更多具体问题或需要进一步的解释,请随时提问。

用例案例

触发器用例:在特定时间打开notepad

你可以使用 PowerShell 命令行来创建一个计划任务,在指定的时间(例如14:47:11)打开 Notepad。下面是详细的步骤和命令:

步骤和命令
  1. 定义任务动作
    首先,定义任务要执行的动作。在这个例子中,任务动作是打开 Notepad。
$action = New-ScheduledTaskAction -Execute "notepad.exe"
  • 1.
  1. 定义任务触发器
    触发器定义了任务何时执行。在这个例子中,我们设置任务在14:47:11执行。
# 设定触发时间
$triggerTime = [datetime]"2024-07-30 20:16:11" #或者:[datetime]"7/30/2024 20:16:11"
$trigger = New-ScheduledTaskTrigger -Once -At $triggerTime
  • 1.
  • 2.
  • 3.
  1. 创建任务
    创建计划任务并将其注册到任务计划程序。
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "OpenNotepadAtSpecificTime" -Description "Open Notepad at 20:16:11"
  • 1.
完整命令示例

将上述步骤结合在一起的完整命令如下:

$action = New-ScheduledTaskAction -Execute "notepad.exe"
$triggerTime = [datetime]"2024-07-30 20:16:11"
$trigger = New-ScheduledTaskTrigger -Once -At $triggerTime
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "OpenNotepadAtSpecificTime" -Description "Open Notepad at 20:16:11"
  • 1.
  • 2.
  • 3.
  • 4.
注意事项
  1. 权限
    创建和注册计划任务通常需要管理员权限。在运行这些命令之前,确保你以管理员身份运行 PowerShell。
  2. 时间格式
    确保时间格式正确,特别是日期和时间的格式要符合 [datetime] 类型的要求。
  3. 检查任务
    你可以使用任务计划程序(Task Scheduler)或 PowerShell 查看和验证创建的任务。例如:
Get-ScheduledTask -TaskName "OpenNotepadAtSpecificTime"
  • 1.