对于纯 Powershell:
文化和 UICulture 有问题
以该文化的语言打印一周的第一天:
(Get-Culture).DateTimeFormat.DayNames[(Get-Culture).DateTimeFormat.FirstDayOfWeek.value__]
maandag (which is My language AND My starting weekday
(Get-uiCulture).DateTimeFormat.DayNames[(Get-Culture).DateTimeFormat.FirstDayOfWeek.value__]
Monday (which is NOT My language BUT is My starting weekday
(Get-uiCulture).DateTimeFormat.DayNames[(Get-uiCulture).DateTimeFormat.FirstDayOfWeek.value__]
Sunday (which is NOT My language AND NOT My starting weekday
(Get-Culture).DateTimeFormat.DayNames[(Get-uiCulture).DateTimeFormat.FirstDayOfWeek.value__]
zondag (which is My language AND NOT My starting weekday
然后是周数不符合 ISO8601 标准的问题。
日期 2012-12-31 应该是第 1 周,但它给出了 53。
因此,您必须为此实施某种解决方案。
(Get-Culture).Calendar.GetWeekOfYear((Get-Date).AddDays(3*([int](Get-Date).DayOfWeek -in (1,2,3))), ((Get-Culture).DateTimeFormat.CalendarWeekRule), ((Get-Culture).DateTimeFormat.FirstDayOfWeek))
用于测试:
(Get-Culture).Calendar.GetWeekOfYear((Get-Date('2013-01-01')).AddDays(3*([int](Get-Date('2013-01-01')).DayOfWeek -in (1,2,3))), ((Get-Culture).DateTimeFormat.CalendarWeekRule), ((Get-Culture).DateTimeFormat.FirstDayOfWeek))
(Get-Culture).Calendar.GetWeekOfYear((Get-Date('2012-12-31')).AddDays(3*([int](Get-Date('2012-12-31')).DayOfWeek -in (1,2,3))), ((Get-Culture).DateTimeFormat.CalendarWeekRule), ((Get-Culture).DateTimeFormat.FirstDayOfWeek))
(Get-Culture).Calendar.GetWeekOfYear((Get-Date('2012-12-30')).AddDays(3*([int](Get-Date('2012-12-30')).DayOfWeek -in (1,2,3))), ((Get-Culture).DateTimeFormat.CalendarWeekRule), ((Get-Culture).DateTimeFormat.FirstDayOfWeek))
这些应该给出 1,1,52(正确)而不是 1,53,52(不正确)。
或者(UICulture相关版本)
(Get-UICulture).Calendar.GetWeekOfYear((Get-Date).AddDays(3*([int](Get-Date).DayOfWeek -in (0,1,2))), ((Get-UICulture).DateTimeFormat.CalendarWeekRule), ((Get-UICulture).DateTimeFormat.FirstDayOfWeek))
用于测试:
(Get-UICulture).Calendar.GetWeekOfYear((Get-Date('2013-01-01')).AddDays(3*([int](Get-Date('2013-01-01')).DayOfWeek -in (0,1,2))), ((Get-UICulture).DateTimeFormat.CalendarWeekRule), ((Get-UICulture).DateTimeFormat.FirstDayOfWeek))
(Get-UICulture).Calendar.GetWeekOfYear((Get-Date('2012-12-31')).AddDays(3*([int](Get-Date('2012-12-31')).DayOfWeek -in (0,1,2))), ((Get-UICulture).DateTimeFormat.CalendarWeekRule), ((Get-UICulture).DateTimeFormat.FirstDayOfWeek))
(Get-UICulture).Calendar.GetWeekOfYear((Get-Date('2012-12-30')).AddDays(3*([int](Get-Date('2012-12-30')).DayOfWeek -in (0,1,2))), ((Get-UICulture).DateTimeFormat.CalendarWeekRule), ((Get-UICulture).DateTimeFormat.FirstDayOfWeek))
(Get-UICulture).Calendar.GetWeekOfYear((Get-Date('2012-12-29')).AddDays(3*([int](Get-Date('2012-12-29')).DayOfWeek -in (0,1,2))), ((Get-UICulture).DateTimeFormat.CalendarWeekRule), ((Get-UICulture).DateTimeFormat.FirstDayOfWeek))
这些应该给出 1,1,1,52(正确)而不是 1,53,53,52(不正确)。
因为从工作日开始是星期日。
您可以通过将 3* 替换为 0* 来测试不正确的结果。
把它做成一个函数,你可以不给它参数一个日期或一个字符串:
function Get-ISO8601Week {
Param(
$getISO8601Week = $(Get-Date)
)
If ($getISO8601Week.GetType() -eq [string]){
$getISO8601Week = (Get-Date($getISO8601Week))
}
$getCulture = Get-Culture
($getCulture).Calendar.GetWeekOfYear(
$getISO8601Week.AddDays(
3*([int]$getISO8601Week.DayOfWeek -in (0,1,2))
), ($getCulture.DateTimeFormat.CalendarWeekRule
), ($getCulture.DateTimeFormat.FirstDayOfWeek
)
)
}
Get-ISO8601Week $(Get-Date('2012-12-31'))
1
Get-ISO8601Week (Get-Date('2012-12-31'))
1
Get-ISO8601Week '2012-12-31'
1
当我写这篇文章时:
Get-ISO8601Week
4