2014-05-05 5 views
1

У меня есть запланированная задача, которая запускает скрипт powershell, который запускает исполняемый файл с некоторыми параметрами. Одним из параметров является номер текущей недели.Как первый день недели определяется в powershell?

Я использую следующий код в PowerShell для получения НомерНедели:

get-date -uformat %V 

Это, кажется, вернуть неверные НомерНедели

  • 2014-05-04 (воскресенье), возвращает неделю NR 18 (как ожидалось)
  • 2014-05-05 (понедельник), возвращает неделю NR 18 (ожидаемый 19)
  • 2014-05-06 (вторник), возвращает неделю NR 19 (как ожидалось)

В моем реестром первый день недели установлен в понедельник (HKEY_CURRENT_USER-> Панель управления-> International-> iFirstDayOfWeek = 0)

Кто-нибудь знает, где PowerShell извлекает это firstDayOfWeek настройка от? Должен ли (/ может) установить его в скрипте?

Я знаю, что обходной путь заключается в использовании .AddDays (1), но я ищу более аккуратное решение.

Edit: Хорошо это действительно странно, я получаю разные «первый день недели для разных лет ..

2012 - В субботу:

PS C:\Users\A730978F> get-date -date "2012-01-08" -uFormat "%Y-%m-%d %a Week: %V" 
2012-01-08 Sun Week: 2 
PS C:\Users\A730978F> get-date -date "2012-01-09" -uFormat "%Y-%m-%d %a Week: %V" 
2012-01-09 Mon Week: 2 
PS C:\Users\A730978F> get-date -date "2012-01-10" -uFormat "%Y-%m-%d %a Week: %V" 
2012-01-10 Tue Week: 2 
PS C:\Users\A730978F> get-date -date "2012-01-11" -uFormat "%Y-%m-%d %a Week: %V" 
2012-01-11 Wed Week: 2 
PS C:\Users\A730978F> get-date -date "2012-01-12" -uFormat "%Y-%m-%d %a Week: %V" 
2012-01-12 Thu Week: 2 
PS C:\Users\A730978F> get-date -date "2012-01-13" -uFormat "%Y-%m-%d %a Week: %V" 
2012-01-13 Fri Week: 2 
PS C:\Users\A730978F> get-date -date "2012-01-14" -uFormat "%Y-%m-%d %a Week: %V" 
2012-01-14 Sat Week: 3 

2013 - В понедельник:

PS C:\Users\A730978F> get-date -date "2013-01-06" -uFormat "%Y-%m-%d %a Week: %V" 
2013-01-06 Sun Week: 1 
PS C:\Users\A730978F> get-date -date "2013-01-07" -uFormat "%Y-%m-%d %a Week: %V" 
2013-01-07 Mon Week: 2 
PS C:\Users\A730978F> get-date -date "2013-01-08" -uFormat "%Y-%m-%d %a Week: %V" 
2013-01-08 Tue Week: 2 

2014 - Во вторник:

PS C:\Users\A730978F> get-date -date "2014-01-05" -uFormat "%Y-%m-%d %a Week: %V" 
2014-01-05 Sun Week: 1 
PS C:\Users\A730978F> get-date -date "2014-01-06" -uFormat "%Y-%m-%d %a Week: %V" 
2014-01-06 Mon Week: 1 
PS C:\Users\A730978F> get-date -date "2014-01-07" -uFormat "%Y-%m-%d %a Week: %V" 
2014-01-07 Tue Week: 2 

2015 - В среду:

PS C:\Users\A730978F> get-date -date "2015-01-04" -uFormat "%Y-%m-%d %a Week: %V" 
2015-01-04 Sun Week: 1 
PS C:\Users\A730978F> get-date -date "2015-01-05" -uFormat "%Y-%m-%d %a Week: %V" 
2015-01-05 Mon Week: 1 
PS C:\Users\A730978F> get-date -date "2015-01-06" -uFormat "%Y-%m-%d %a Week: %V" 
2015-01-06 Tue Week: 1 
PS C:\Users\A730978F> get-date -date "2015-01-07" -uFormat "%Y-%m-%d %a Week: %V" 
2015-01-07 Wed Week: 2 

(Обратите внимание, что я не пробовал все недели за каждый год)

Edit2:

После снова глядя на примерах его кажется, что номер недели основан на количестве «7 дней», которое прошло. Думаю, на самом деле он вообще не использует настройки «первого дня недели». Думаю, мне придется сделать некоторые вычисления соответственно.

Спасибо за помощь в любом случае!

+2

Связанный: http://stackoverflow.com/questions/15111557/using-powershell-how-do-you-get-the-weekday-number –

ответ

0

Видимо параметр powershell -uformat %V фактически не использует правило «первого дня недели». На самом деле это просто показывает количество «7 дней», которое прошло с начала года (начиная с 1).

Используя эту информацию, я сделал следующую функцию, которая получает один и тот же правильный номер недели на каждый день в течение недели (с воскресенья по субботу):

(Спасибо обоим @DavidBrabant и @vonPryz для получения дополнительной информации, необходимой мне)

Function GetWeekOfYear($date) 
{ 
    # Note: first day of week is Sunday 
    $intDayOfWeek = (get-date -date $date).DayOfWeek.value__ 
    $daysToWednesday = (3 - $intDayOfWeek) 
    $wednesdayCurrentWeek = ((get-date -date $date)).AddDays($daysToWednesday) 

    # %V basically gets the amount of '7 days' that have passed this year (starting at 1) 
    $weekNumber = get-date -date $wednesdayCurrentWeek -uFormat %V 

    return $weekNumber 
} 

$weekNumber = GetWeekOfYear (get-date) 

(я использовал параметр, так что функция является более гибким/проверяемым)

Эта функция в основном получает номер недели, основанный на п-й среды O в год и использует воскресенье в качестве первого дня недели (я не накладывал времени на изменение, поскольку это на самом деле конвенция, которую использует моя компания).

Вы можете сказать, что он возвращает номер недели, основываясь на первой неделе, имеющей не менее 4 дней в этом году, и в первый день недели будет воскресенье.

0

Проблема вызвана различными правилами глобализации. Номера недель в США подсчитываются по-разному, например, из Германии.

Для того чтобы получить ожидаемую нумерацию нужной вам недели, вам нужно вытащить некоторые строки с настройками глобализации. Еще один номер SO question подробно рассказал о теме.

+1

Спасибо за ваш ответ, неделя 53 была действительно другой проблемой, я был иметь. Тем не менее, этот вопрос фактически касался проблемы с получением номера правой недели, основанного на дне недели (изменение недели не было между воскресеньем и понедельником) – Deruijter

Смежные вопросы