如何使用PowerShell将INT值HHMMSS转换为TimeSpan

如何使用PowerShell将INT值HHMMSS转换为TimeSpan,powershell,Powershell,我正在PowerShell中创建一个应用程序,以重新安排SQL Server实例中的现有作业。因此,我必须从sysschules表中获取active\u start\u time值。时间值的格式为24小时时钟上的INTHHMMSS 由于我在PowerShell应用程序中使用JobSchedule类(Microsoft.SqlServer.Management.Smo.Agent.JobSchedule),我需要将INT中的时间值转换为时间跨度值,以便添加到ActiveStartTimeOfDay

我正在PowerShell中创建一个应用程序,以重新安排SQL Server实例中的现有作业。因此,我必须从
sysschules
表中获取
active\u start\u time
值。时间值的格式为24小时时钟上的
INT
HHMMSS

由于我在PowerShell应用程序中使用JobSchedule类(Microsoft.SqlServer.Management.Smo.Agent.JobSchedule),我需要将
INT
中的时间值转换为时间跨度值,以便添加到
ActiveStartTimeOfDay
属性

示例:

原始数据:
[INT]
active\u start\u time=10500


预期数据:
[TimeSpan]
ActiveStartTimeOfDay=01h 05 min 00s

我们可以通过将您的输入
int
作为字符串处理来完成此操作。这样我们就可以调用
ToCharArray()
,这样做

$myString = "Hi!"
$myString.ToCharArray()
H
i
!
一旦它位于字符数组中,我们可以通过指定其索引(从零开始)来选择所需字符的位置,如下所示:

PS> $myString.ToCharArray()[0] #get's the first
H
将其应用到您的场景中,我们也会这样做,只选择我们想要的数字,并将它们塞进变量中,以便稍后调用。有了它,我们可以轻松地构建一个新的
[TimeSpan]
对象

$inputInt = 121515
$hours= $inputInt.ToString().ToCharArray()[0..1] -join ''
$mins= $inputInt.ToString().ToCharArray()[2..3] -join ''
$secs = $inputInt.ToString().ToCharArray()[4..5] -join ''

$hours,$mins,$secs -join ":"
Output> 12:15:15
有很多选项可以创建一个新的
[TimeSpan]
,我们可以通过键入静态类名和方法来查看我们的选择,并查看出现了什么

PS> [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)     
第二个看起来很有希望

$newTimeSpan = [TimeSpan]::new($hours,$mins,$secs)
$newTimeSpan

这将使您朝着正确的方向前进。

我们可以通过将您的输入
int
当作字符串来处理。这样我们就可以调用
ToCharArray()
,这样做

$myString = "Hi!"
$myString.ToCharArray()
H
i
!
一旦它位于字符数组中,我们可以通过指定其索引(从零开始)来选择所需字符的位置,如下所示:

PS> $myString.ToCharArray()[0] #get's the first
H
将其应用到您的场景中,我们也会这样做,只选择我们想要的数字,并将它们塞进变量中,以便稍后调用。有了它,我们可以轻松地构建一个新的
[TimeSpan]
对象

$inputInt = 121515
$hours= $inputInt.ToString().ToCharArray()[0..1] -join ''
$mins= $inputInt.ToString().ToCharArray()[2..3] -join ''
$secs = $inputInt.ToString().ToCharArray()[4..5] -join ''

$hours,$mins,$secs -join ":"
Output> 12:15:15
有很多选项可以创建一个新的
[TimeSpan]
,我们可以通过键入静态类名和方法来查看我们的选择,并查看出现了什么

PS> [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)     
第二个看起来很有希望

$newTimeSpan = [TimeSpan]::new($hours,$mins,$secs)
$newTimeSpan
这将使您朝着正确的方向前进。

请将输入的数字视为字符串

首先,您需要使用零填充数字:

$active\u start\u time=10500
$start_timestamp=“$active_start_time”。左键(6,'0')#“010500”
现在我们有了一个排序的“时间戳,
[timespan]
有了一个方法,可以用来解析任何格式:

$start\u timespan=[timespan]::ParseExact($start\u时间戳,'hhmmss',$null)
,将输入的数字视为字符串

首先,您需要使用零填充数字:

$active\u start\u time=10500
$start_timestamp=“$active_start_time”。左键(6,'0')#“010500”
现在我们有了一个排序的“时间戳,
[timespan]
有了一个方法,可以用来解析任何格式:

$start\u timespan=[timespan]::ParseExact($start\u时间戳,'hhmmss',$null)

是否需要使用
.tocharray()
。看起来你可以在字符串上使用
[0..1]
索引语法。我想他指定的输入是int。嗨,FoxDeploy,谢谢你回答这个问题。但我认为,当输入长度小于6位时,这将中断。例如,$inputInt=5,那么我需要一个像00:00:05这样的时间跨度。@FoxDeploy是的,他说它是一个int。但是你调用
.ToString()
来获取一个字符串,然后对该字符串调用
.tocharray()
(三次)。似乎您可以放弃
.tocharray()
,因为它没有任何用途。是否需要使用
.tocharray()
。看起来你可以在字符串上使用
[0..1]
索引语法。我想他指定的输入是int。嗨,FoxDeploy,谢谢你回答这个问题。但我认为,当输入长度小于6位时,这将中断。例如,$inputInt=5,那么我需要一个像00:00:05这样的时间跨度。@FoxDeploy是的,他说它是一个int。但是你调用
.ToString()
来获取一个字符串,然后对该字符串调用
.tocharray()
(三次)。看来你可以扔掉
.ToCharArray()
,因为它没有任何用处。谢谢你,Mathias!谢谢你,马蒂亚斯!