【问题标题】:PowerShell to find if today is in between two other daysPowerShell查找今天是否在另外两天之间
【发布时间】:2021-03-24 22:58:14
【问题描述】:

给定开始日期和时间(星期五下午 5 点)和结束日期和时间(星期一凌晨 5 点),如何使用 PowerShell 确定今天是否介于两者之间?我完全不知所措。

谢谢

【问题讨论】:

    标签: powershell datetime


    【解决方案1】:

    假设本地时间戳:

    如果你定义了这个函数:

    function Test-TimeWindow {
      param(
        [Parameter(Mandatory)] [DateTime] $TimeStamp,
        [Parameter(Mandatory)] [DayOfWeek] $FromDay,
        [timespan] $FromTime = '00:00',
        [Parameter(Mandatory)] [DayOfWeek] $ToDay,
        [timespan] $ToTime = '00:00' 
      )
    
      $interveningFullDays = [int] $ToDay + (0, 7)[[int] $FromDay -gt [int] $ToDay] - $FromDay - 1
      [dayofweek[]] $interveningFullDoWs = 
        if ($interveningFullDays -gt 0) {
          foreach ($i in 1..$interveningFullDays) {
            ([int] $FromDay + $i) % 7
          }
        }
      
      $TimeStamp.DayOfWeek -in $interveningFullDoWs -or
        ($TimeStamp.DayOfWeek -eq $FromDay -and $TimeStamp.TimeOfDay -ge $FromTime) -or 
        ($TimeStamp.DayOfWeek -eq $ToDay -and $TimeStamp.TimeOfDay -le $ToTime)
    
    }
    

    你可以这样称呼它:

    # Outputs $true if the current point in time falls inside the specified window.
    # Note: 
    #  * '17:00' is the 24-hour-clock representation of 5 PM
    #     Both times must be represented in this format.
    #  * Day-of-week names can be abbreviated, as long as the abbrevation
    #    is unambiguous.
    Test-TimeWindow (Get-Date) Fri 17:00 Mon 05:00
    

    【讨论】:

    • 我喜欢!唯一的潜在问题是假设目标周五至周一在本周。
    • 非常优雅,回答了我的字面问题。问题正如@DougMaurer 所建议的那样。这是用户提供开始和停止日期的更改窗口创建例程的一部分。可能并不总是选择周五到周一。
    • 谢谢@DougMaurer,但这根本不是特定的一周——它适用于任何周。
    • @mklement0 我明白了,我的错误。这只是说“我是在任何周五下午 5 点到周日早上 5 点之间约会吗”
    • 很高兴听到它,@StevieJ - 让它按预期工作(我希望)比预期的要棘手。
    【解决方案2】:

    如果你有/可以计算出合适的日期,那么你可以测试它是否小于和大于。

    $today = Get-Date
    
    $monday = Get-Date '03-29-2021 07:00'
    
    $friday = Get-Date '03-26-2021 17:00'
    
    $today -le $monday -and $today -ge $friday  # returns false for today 03-24-2021
    

    测试条件内的实际日期/时间

    $testday = Get-Date '03-28-2021 19:33'
    
    $testday -lt $monday -and $testday -gt $friday # returns true
    

    【讨论】:

    • 不幸的是,我不知道实际日期。它是每周更改窗口的一部分。我想问用户他们想选择哪一天开始和停止。我应该在这个问题上更具体。
    • 该解决方案仍然适用。您将提示或以其他方式从用户那里获取输入。将其存储在一个变量中,并从那里跟踪 Doug 的答案。
    • @steven 谢谢你,打败我。 Stevie J,或许可以展示一下捕获后日期字符串的外观。
    • 顺便说一下,在日期范围的情况下,我喜欢考虑-le & -ge。在这种情况下,它将覆盖用户在窗口打开或关闭时精确指定时间的边缘情况。
    【解决方案3】:
    function IsTodayInbetween($startDay, $startTime, $endDay, $endTime) {
        $date = Get-Date 
        $time = (Get-Date).TimeOfDay;
        $startTimeFormatted = [datetime]::ParseExact($startTime, "h tt", $null).TimeOfDay;
        $endTimeFormatted = [datetime]::ParseExact($endTime, "h tt", $null).TimeOfDay;
    
        $daysToStart = 0;
        if ($date.AddDays($daysToStart).DayOfWeek -ne $startDay) {
            do { $daysToStart++; } while ($date.AddDays($daysToStart).DayOfWeek -ne $startDay);
        }
        $daysToEnd = 0
        if ($date.AddDays($daysToEnd).DayOfWeek -ne $endDay) {
            do { $daysToEnd++; } while ($date.AddDays($daysToEnd).DayOfWeek -ne $endDay)
        }
    
        if ($daysToEnd -gt $daysToStart -And $daysToStart -ne 0) { return $false }
        if (($daysToStart -eq 0 -And $time -lt $startTimeFormatted)) { 
            return $false; 
        }
        if (($daysToEnd -eq 0 -And $time -gt $endTimeFormatted))
        {
            return $false;
        }
        return $true;
        
        
    }
    
    
    write-host "Is Todays date inbetween ? $((IsTodayInbetween -startDay 'Monday' -startTime '5 AM' -endDay 'Friday' -endTime '5 PM'))";
    write-host "Is Todays date inbetween ? $((IsTodayInbetween -startDay 'Thursday' -startTime '5 AM' -endDay 'Thursday' -endTime '5 PM'))";
    write-host "Is Todays date inbetween ? $((IsTodayInbetween -startDay 'Monday' -startTime '5 AM' -endDay 'Friday' -endTime '5 PM'))";
    write-host "Is Todays date inbetween ? $((IsTodayInbetween -startDay 'Friday' -startTime '5 AM' -endDay 'Monday' -endTime '5 PM'))";
    write-host "Is Todays date inbetween ? $((IsTodayInbetween -startDay 'Saturday' -startTime '5 AM' -endDay 'Sunday' -endTime '5 PM'))";
    write-host "Is Todays date inbetween ? $((IsTodayInbetween -startDay 'Thursday' -startTime '2 PM' -endDay 'Monday' -endTime '5 PM'))";
    write-host "Is Todays date inbetween ? $((IsTodayInbetween -startDay 'Saturday' -startTime '5 AM' -endDay 'Friday' -endTime '5 PM'))";
    

    【讨论】:

    • IsTodayInbetween -startDay '星期一' -startTime '5 AM' -endDay '星期五' -endTime '5 PM'
    • 只是想我会添加文字函数调用。我还假设,您正在处理 5 am 的字符串,而不是日期时间值。
    • 包括了一些运行以输出到控制台。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多