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 测试溢出。