首页 > 解决方案 > 将时间(小时和分钟)插入日期时间对象

问题描述

我有一个脚本,它接受开始日期和开始时间作为单独的参数。如果没有提供开始日期,我假设他们希望日期是今天,如果没有开始时间,我想假设它应该是“无论现在是什么时间”。

我不想(太多)限制用户输入日期或时间的方式。例如,我希望他们能够输入 do-StartDate (Get-Date)所以我需要能够接受该对象(包括时间),然后,由于没有输入 StartTime,我需要将对象上的任何时间替换为当前时间。

我想过说如果$StartDate变量中有时间,那么使用它,但如果他们这样做-StartDate 07/10/2018,那么我仍然需要添加时间。

经过一番搜索,这是我尝试的结果:

PS C:\> Get-Date

Tuesday, July 10, 2018 3:15:58 PM

PS C:\> $StartDate = (Get-Date).AddDays(1)
>> $StartTime = [DateTime]::ParseExact((Get-Date -Format HH:mm).ToString(),"HH:mm",[System.Globalization.CultureInfo]::InvariantCulture)
>> [datetime]$StartDate = $StartDate
>> $StartDate = $StartDate.Add([System.Timespan]::Parse($StartTime))
>> $StartDate

Exception calling "Parse" with "1" argument(s): "String was not recognized as a valid TimeSpan."
At line:4 char:1
+ $StartDate = $StartDate.Add([System.Timespan]::Parse($StartTime))
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FormatException

Wednesday, July 11, 2018 3:16:10 PM

所以,我认为问题是,“我如何花费特定时间并将其插入到 datetime 对象中?” 或者也许有更好的方法来实现我的目标,这也很酷。

谢谢。

标签: powershelldatetime

解决方案


您始终可以通过 的相应参数构造日期Get-Date,例如

Get-Date -Hour 8 -Minute 30

会给你今天的日期,时间是 8:30。

您也可以只DateTime取值的日期部分,如下所示:

$today = (Get-Date).Date

加几天(或只加几天)

$tomorrow = $today.AddDays(1)

然后添加所需的时间跨度:

$time = New-Timespan -Hour 8 -Minute 30
$tomorrow.Add($time)

也可以菊花链式连接:

$time = New-Timespan -Hour 8 -Minute 30
(Get-Date).Date.AddDays(1).Add($time)

在您的特定场景中,您可以将开始日期作为一个DateTime值,去掉时间,然后添加时间跨度,例如从字符串参数:

Param(
    [Parameter(Mandatory=$true)]
    [DateTime]$StartDate,
    [Parameter(Mandatory=$true)]
    [String]$StartTime
)

$StartDate.Date.Add([Timespan]::Parse($StartTime))

并像这样调用它:

foo -StartDate (Get-Date) -StartTime '8:30'

或者你会为小时和分钟使用不同的参数:

Param(
    [Parameter(Mandatory=$true)]
    [DateTime]$StartDate,
    [Parameter(Mandatory=$true)]
    [ValidateRange(0,23)]
    [Integer]$Hour,
    [Parameter(Mandatory=$false)]
    [ValidateRange(0,59)]
    [Integer]$Minute = 0
)

$StartDate.Date.Add((New-Timespan -Hour $Hour -Minute $Minute))

并像这样调用脚本/函数:

foo -StartDate (Get-Date) -Hour 8 -Minute 30

推荐阅读