Преобразование даты в номер недели

Привет Не уверен, что кто-нибудь может мне помочь.

Как я могу преобразовать текущую дату в номер недели в пакетном сценарии?

Я знаю только, как генерировать текущую дату с моего компьютера. %ДАТА%

например. 16.03.2017 - 11 неделя.


person lcc    schedule 16.03.2017    source источник


Ответы (3)


В качестве альтернативы вызовите Powershell из пакетного файла с помощью простого однострочного кода:

@for /f %%a in ('powershell.exe get-date -UFormat %%V') do @set WeekInYear=%%a
person Filipus    schedule 16.03.2017
comment
Хотя PowerShell намного мощнее, чем пакетные файлы, в этом простом однострочнике используется файл powershell.exe размером 470 КБ, поэтому для получения нужно несколько секунд (6,96 секунды в моем тесте). тот же результат, который достигается сразу любым другим методом! Совет может быть таким: не используйте PowerShell для простых одноразовых вычислений, подобных этому... - person Aacini; 16.03.2017
comment
Мой SSD может искажать мои собственные результаты, потому что выполнение этого пакета занимает меньше секунды в моей системе. Но я согласен с Аачини, что иногда путь к простоте стоит дорого! - person Filipus; 20.03.2017

используйте это:

@echo off
set "weekn="

    for /f %%W in (
        'mshta vbscript:Execute("createobject(""scripting.filesystemobject"").GetStandardStream(1).writeline(DatePart(""ww"",Now()))"^^^&close^)'
    ) do @( 
     set "weekn=%%W"
    )

echo %weekn%
person npocmaka    schedule 16.03.2017
comment
Он работает отлично! Но что означает предложение внутри цикла for? - person lcc; 16.03.2017
comment
@lcc mshta — это встроенный инструмент, который может открывать html файлы (а также скрипты там имеют доступ к файловой системе) с mshta vbscript:.. или mshta javascript:... вы можете внедрить исполняемый код в его заголовок. Хотя обычно требуются неприятные escape-последовательности и запись в консоль не так проста (требуется GetStandardStream(1) и допустимый канал), это удобно для коротких выражений. - person npocmaka; 16.03.2017
comment
Знаете ли вы эквивалентный метод для JScript? - person Aacini; 16.03.2017
comment
@Aacini - в стандартных функциях javascript нет, но написать это несложно. - person npocmaka; 16.03.2017
comment
Не так уж и важно? Я просмотрел 16 ответов на этот вопрос и 13 ответов на этот, и все они имеют комментарии о том, что это не работает или крайне сложный! Я попробую этот: now = new Date(); onejan = new Date(now.getFullYear(), 0, 1); week = Math.ceil( (((now - onejan) / 86400000) + onejan.getDay() + 1) / 7 ) - person Aacini; 16.03.2017
comment
@Aacini - на основе этого - Math.floor(Math.floor(((new Date())-(new Date((new Date()).getFullYear(), 0, 0)))/(1000 * 60 * 60 * 24))/7+1); - person npocmaka; 16.03.2017
comment
Вы должны позаботиться о том, какое определение недели относится к вашей локали (и каков первый день недели), см. эта статья в википедии - person ; 17.03.2017
comment
@Aacini: используя свой собственный код и сочетая его с гениальным взломом, найденным здесь: (blogs.msdn.microsoft.com/joshpoley/2008/01/15/), вы можете использовать следующий пакетный файл @if (@Dummy == @Dummy) @then @cscript //Nologo //E:JSCRIPT "%~dpnx0" %* & @goto :eof @end now=new Date();jan1=new Date(now.getFullYear(),0,1);WScript.Echo(Math.ceil((((now-jan1)/86400000)+jan1.getDay()+1)/7)); - person Filipus; 02.05.2017

Чистое пакетное решение. Кредит Ричи Лоуренсу

@echo off & setlocal ENABLEEXTENSIONS
call :DateToWeek 2017 03 16 yn cw dw
echo/Today (in ISO 8601 Week Date format) is: %yn%-W%cw%-%dw%
pause
goto :EOF



::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
:DateToWeek %yy% %mm% %dd% yn cw dw
::
:: By:   Ritchie Lawrence, Updated 2002-11-20. Version 1.1
::
:: Func: Returns an ISO 8601 Week date from a calendar date.
::       For NT4/2000/XP/2003.
:: 
:: Args: %1 year component to be converted, 2 or 4 digits (by val)
::       %2 month component to be converted, leading zero ok (by val)
::       %3 day of month to be converted, leading zero ok (by val)
::       %4 var to receive year, 4 digits (by ref)
::       %5 var to receive calendar week, 2 digits, 01 to 53 (by ref)
::       %6 var to receive day of week, 1 digit, 1 to 7 (by ref)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
set yy=%1&set mm=%2&set dd=%3
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,Jd=153*m+2
set /a Jd=Jd/5+dd+y*365+y/4-y/100+y/400-32045
set /a y=yy+4798,Jp=y*365+y/4-y/100+y/400-31738,t=Jp+3,Jp=t-t%%7
set /a y=yy+4799,Jt=y*365+y/4-y/100+y/400-31738,t=Jt+3,Jt=t-t%%7
set /a y=yy+4800,Jn=y*365+y/4-y/100+y/400-31738,t=Jn+3,Jn=t-t%%7
set /a Jr=%Jp%,yn=yy-1,yn+=Jd/Jt,yn+=Jd/Jn
if %Jd% GEQ %Jn% (set /a Jr=%Jn%) else (if %Jd% GEQ %Jt% set /a Jr=%Jt%)
set /a diff=Jd-Jr,cw=diff/7+1,wd=diff%%7,wd+=1
if %cw% LSS 10 set cw=0%cw%
endlocal&set %4=%yn%&set %5=%cw%&set %6=%wd%&goto :EOF
person Squashman    schedule 16.03.2017
comment
является ли этот формат даты независимым? - person npocmaka; 16.03.2017