Powershell 仅将字符串转换为时间
Powershell cast string to time only
我创建了一个 Powershell/XAML 应用程序,按下按钮时会调用 RESTAPI,将 JSON 响应解析到应用程序前端的字段中。目前一切正常。
这些字段将填充一个表示时间的字符串,例如“1800”或“2000”等
例如,用户然后可以将其从 1800 更改为 1900。
这一切都很好,在后台,应用程序将使用 1900 来更新要在 POST 后面使用的设置。
然而,还有其他设置会比上述时间偏移 90 分钟。我不希望用户更新每个,这就是我尝试以编程方式进行更新的原因。
但尽我所能,我无法将 1800 的字符串加上 90 分钟,使值变为 1930(而不是 1890)。
您可以将输入解析为 DateTime
对象(忽略日期部分),然后使用 AddMinutes
方法。
$input = '1800'
$hour = $input.Substring(0,2)
$minute = $input.Substring(2,2)
$dateInputStr = "0001-01-01,${hour}:${minute}:00"
[datetime]$dateInput = ([datetime]$dateInputStr)
$dateInput = $dateInput.AddMinutes(90)
$dateInput.ToString("HHmm")
使用 [timespan]
个实例是另一种选择:
$time = '1800'
([timespan] ($time -replace '(?<=^..)', ':') + '01:30').ToString('hhmm') #->'1930'
$time -replace '(?<=^..)', ':'
使用 regex-based -replace
operator to insert :
after the first two characters - see this regex101.com page 解释正则表达式和使用它进行实验的能力。
由于仅以小时和分钟表示结果,计算在午夜结束,因此添加 '05:30'
,例如,将产生 '0030'
RHS 操作数不需要直接转换为 [timespan]
,因为 LHS 的数据类型 - 具有显式 [timespan]
转换 - 隐式将 RHS 转换为 [timespan]
也一样,'01:30'
代表 1
小时和 30
分钟,即 90
分钟。
如果要定义以 90
分钟为单位添加的持续时间,请改用以下方法(其他单位也有类似的静态方法,例如 ::FromSeconds()
:
[timespan]::FromMinutes(90)
或者,您可以将 number 转换为 [timespan]
,它被解释为 ticks,以 100 纳秒为单位;一秒有 1e9
(10 的 9 次方)纳秒,因此一秒有 1e7
100 纳秒单位。因此,乘以 1e7
得到秒,然后乘以 60
分钟。
# 90 minutes expressed as ticks
[timespan] 90 * (60 * 1e7)
当我读到这个问题时,我想用最少的字符串操作来解决它,而是依靠与时间相关的对象和方法。 datetime
是我想到的第一个对象,但它需要一个日期(年、月、日)。如果我们使用 timespan
,事情实际上会变得简单。它的静态方法,ParseExact
,可以直接解析字符串。
$offsetTimeSpan = [timespan]::FromMinutes(90)
$timeField = '830'
$timeStr = $timeField.PadLeft(4, '0')
$timeSpan = [timespan]::ParseExact($timeStr, 'hhmm', [CultureInfo]::InvariantCulture)
$offsetTime = $timeSpan.Add($offsetTimeSpan)
$offsetTime.ToString('hhmm')
$timeField
用于表示从RESTAPI获取的时间。 PadLeft
仅在可能缺少前导 0 时才需要。 ParseExact
负责将字符串转换为时间类型的繁重工作。因为 timespan
没有 AddMinutes
成员,所以我们使用 Add
方法传入一个 timespan
90 分钟,$offsetTimeSpan
.
你只字不提午夜过后的事。如果需要任何特殊处理,您可以使用 $offsetTime.Days
测试溢出。
我创建了一个 Powershell/XAML 应用程序,按下按钮时会调用 RESTAPI,将 JSON 响应解析到应用程序前端的字段中。目前一切正常。
这些字段将填充一个表示时间的字符串,例如“1800”或“2000”等
例如,用户然后可以将其从 1800 更改为 1900。
这一切都很好,在后台,应用程序将使用 1900 来更新要在 POST 后面使用的设置。
然而,还有其他设置会比上述时间偏移 90 分钟。我不希望用户更新每个,这就是我尝试以编程方式进行更新的原因。
但尽我所能,我无法将 1800 的字符串加上 90 分钟,使值变为 1930(而不是 1890)。
您可以将输入解析为 DateTime
对象(忽略日期部分),然后使用 AddMinutes
方法。
$input = '1800'
$hour = $input.Substring(0,2)
$minute = $input.Substring(2,2)
$dateInputStr = "0001-01-01,${hour}:${minute}:00"
[datetime]$dateInput = ([datetime]$dateInputStr)
$dateInput = $dateInput.AddMinutes(90)
$dateInput.ToString("HHmm")
使用 [timespan]
个实例是另一种选择:
$time = '1800'
([timespan] ($time -replace '(?<=^..)', ':') + '01:30').ToString('hhmm') #->'1930'
$time -replace '(?<=^..)', ':'
使用 regex-based-replace
operator to insert:
after the first two characters - see this regex101.com page 解释正则表达式和使用它进行实验的能力。由于仅以小时和分钟表示结果,计算在午夜结束,因此添加
'05:30'
,例如,将产生'0030'
RHS 操作数不需要直接转换为
[timespan]
,因为 LHS 的数据类型 - 具有显式[timespan]
转换 - 隐式将 RHS 转换为[timespan]
也一样,'01:30'
代表1
小时和30
分钟,即90
分钟。如果要定义以
90
分钟为单位添加的持续时间,请改用以下方法(其他单位也有类似的静态方法,例如::FromSeconds()
:[timespan]::FromMinutes(90)
或者,您可以将 number 转换为
[timespan]
,它被解释为 ticks,以 100 纳秒为单位;一秒有1e9
(10 的 9 次方)纳秒,因此一秒有1e7
100 纳秒单位。因此,乘以1e7
得到秒,然后乘以60
分钟。# 90 minutes expressed as ticks [timespan] 90 * (60 * 1e7)
当我读到这个问题时,我想用最少的字符串操作来解决它,而是依靠与时间相关的对象和方法。 datetime
是我想到的第一个对象,但它需要一个日期(年、月、日)。如果我们使用 timespan
,事情实际上会变得简单。它的静态方法,ParseExact
,可以直接解析字符串。
$offsetTimeSpan = [timespan]::FromMinutes(90)
$timeField = '830'
$timeStr = $timeField.PadLeft(4, '0')
$timeSpan = [timespan]::ParseExact($timeStr, 'hhmm', [CultureInfo]::InvariantCulture)
$offsetTime = $timeSpan.Add($offsetTimeSpan)
$offsetTime.ToString('hhmm')
$timeField
用于表示从RESTAPI获取的时间。 PadLeft
仅在可能缺少前导 0 时才需要。 ParseExact
负责将字符串转换为时间类型的繁重工作。因为 timespan
没有 AddMinutes
成员,所以我们使用 Add
方法传入一个 timespan
90 分钟,$offsetTimeSpan
.
你只字不提午夜过后的事。如果需要任何特殊处理,您可以使用 $offsetTime.Days
测试溢出。