Получить приблизительную дату из номера недели - PullRequest
0 голосов
/ 28 февраля 2019

Я получаю информацию о мониторах из WMI.Есть свойства под названием «WeekOfManufacture» и «YearOfManufacture».В данном случае это:

Week : 24
Year : 2009

Я пытаюсь получить приблизительную дату, соответствующую этому.

Я делаю это, чтобы получить действительно грубую оценку:

(Get-Date -Date $YearOfManufacture/01/01).AddDays(7*$WeekOfManufacture)

Но очевидно, что "неделя" не всегда должна иметь 7 дней.

Каков наилучший подход?

Полный код, который я сейчас использую:

$Monitors = Get-WmiObject WmiMonitorID -Namespace root\wmi

foreach ($Monitor in $Monitors) {
    $Manufacturer = ($Monitor.ManufacturerName -notmatch 0 | ForEach{[char]$_}) -join ""
    $Code = ($Monitor.ProductCodeID -notmatch 0 | ForEach{[char]$_}) -join ""
    $Name = ($Monitor.UserFriendlyName -notmatch 0 | ForEach{[char]$_}) -join ""
    $Serial = ($Monitor.SerialNumberID -notmatch 0 | ForEach{[char]$_}) -join ""

    $WeekOfManufacture = $Monitor.WeekOfManufacture
    $YearOfManufacture = $Monitor.YearOfManufacture

    $DateManufacture = (get-date -Date $YearOfManufacture/01/01).AddDays(7*$WeekOfManufacture)

    "$Manufacturer - $Code - $Name - $Serial - $DateManufacture" 
}

, который возвращает что-то вроде (запутанная информация):

SAM - 1234 - SycMastr - XXXX - 06/18/2009 00:00:00
SAM - 1234 - SycMastr - XXXX - 09/10/2009 00:00:00

1 Ответ

0 голосов
/ 28 февраля 2019

Ответ от Technet работает отлично (https://social.technet.microsoft.com/Forums/en-US/f65c80b0-f74f-4234-870c-c5ffe8d9b1ea/powershell-get-date-from-week-number-of-year?forum=ITCG):

Function FirstDateOfWeek
{
    param([int]$year, [int]$weekOfYear)

    $jan1 = [DateTime]"$year-01-01"
    $daysOffset = ([DayOfWeek]::Thursday - $jan1.DayOfWeek)

    $firstThursday = $jan1.AddDays($daysOffset)
    $calendar = ([CultureInfo]::CurrentCulture).Calendar;

    $firstWeek = $calendar.GetWeekOfYear($firstThursday, [System.Globalization.CalendarWeekRule]::FirstFourDayWeek, [DayOfWeek]::Monday)

    $weekNum = $weekOfYear

    if($firstweek -le 1) { $weekNum -= 1 }

    $result = $firstThursday.AddDays($weekNum * 7)
    return $result.AddDays(-3)    
}

FirstDateOfWeek -year 2009 -weekOfYear 24

8 juin 2009 00:00:00
...