2009-06-19 22 views

回答

8

這是很短過(但使用別名):

,(1,2-eq7-(date).dayofweek)|%{(date)+"$(1+$_[0])"} 

在一個單獨的語句:

(date)+"$(1+$(@(1,2-eq7-(date).dayofweek)))" 

對這種做法的幾個注意事項:

  • 在Powershell(v1至少),比較無線個集合返回項目,其中條件爲真,例如:

    PS> 1,2 -eq 1
    PS> 1

  • 我走的事實,即該規則today + 1實際例外來計算下一工作日僅星期五(+3天)和星期六(+2天)。

11

那麼,我的手機允許我設置哪些日子是營業日,但Windows/.NET不會,所以我假設星期一到星期五。

注意:由於問題包含「高爾夫」,因此我正在打高爾夫球這一項,即嘗試儘可能少地使用字節。代碼不一定可讀。

做的最簡單,最直接的方法是將與今天開始,增加了一天,看看它是否在所期望的範圍:

PS> $d = [DateTime]::Now.AddDays(1); while ($d.DayOfWeek -eq "Saturday" -or $d.DayOfWeek -eq "Sunday") { $d = $d.AddDays(1) }; $d 
Montag, 22. Juni 2009 19:50:27 

我們可以縮短這一點,雖然:

PS> $d=(Get-Date)+"1";for(;6,0-contains$d.DayOfWeek){$d+="1"}$d 
Montag, 22. Juni 2009 19:52:31 

但是我們也可以嘗試不同的方式,使用管道。在第二個工作日至少一個和最多三個天了,這樣我們就可以產生可能的日期的列表,並相應地進行篩選,最後,選擇第一個:

PS> @(1..3|%{(Get-Date).AddDays($_)}|?{$_.DayOfWeek -ge "Monday" -and $_.DayOfWeek -le "Friday"})[0] 
Montag, 22. Juni 2009 22:11:19 

或更短:

PS> @(1..3|%{(Get-Date)+"$_"}|?{1..5-contains$_.DayOfWeek})[0] 
Montag, 22. Juni 2009 19:55:53 

通過讓範圍內去4我們可以保證它總是返回至少兩個工作日,節省@操作符來強制數組:

PS> (1..4|%{(Get-Date)+"$_"}|?{1..5-contains$_.DayOfWeek})[0] 
Montag, 22. Juni 2009 20:24:06 
+0

我喜歡那些流水線版本,前兩個版本有兩種說法,非常感謝 – m1k4 2009-06-19 23:14:40

+2

好了,不知道有多條語句是被禁止的。 – Joey 2009-06-19 23:55:19

3

這裏是另一個pipline方法:

(@(1..4) | foreach { if (([datetime]::Now.AddDays($_)).DayOfWeek -ne "Sunday" -and ([datetime]::Now.AddDays($_)).DayOfWeek -ne "Saturday") {[datetime]::Now.AddDays($_); }})[0] 

不知道爲什麼,我卻用(1..4)來代替(1..3)。

+0

好吧,這很明顯。如果當天是星期五,那麼只會得到一個結果(下星期一),它將作爲單個對象返回,而不是作爲數組返回,這就是爲什麼您無法使用[0]索引它的原因。順便說一句,當你使用1..4(你可以放下@()時,你會得到兩個日期,也就是你可以選擇第一個日期的數組。另一個選擇是將@()放在完整的語句中(請參閱我的答案)以強制一個數組(即使只有一個項目),您可以在其中再次使用[0]。 – Joey 2009-06-19 20:08:07

0

我發現第一個答案中的示例代碼非常難以遵循,因此我重寫了它,以便更容易地看到發生了什麼。我仍然使用-eq行爲,其中-eq測試將返回匹配值。

$date = get-date "2013 Apr 24" 

write-host "Based on your date" 
$date 

write-host "next business day (skipping saturday and sunday)" 
$Date.AddDays(1 + $(1,2 -eq 7 - [int]$date.dayofweek)) 

write-host "Next week monday" 
$Date.AddDays(1 + $(0,1,2,3,4,5,6,7 -eq 7 - [int]$date.dayofweek))