CMD 中的 ISO 周数

Posted

技术标签:

【中文标题】CMD 中的 ISO 周数【英文标题】:ISO week number in CMD 【发布时间】:2017-01-15 10:03:28 【问题描述】:

如何确定 Windows 批处理文件中的 (ISO 8601) 周数?

不幸的是 WMIC PATH WIN32_LOCALTIME GET /FORMAT:LIST 只有 WeekInMonth...

我找到了一些verycomplexsolutions。没有更简单的方法吗?

【问题讨论】:

【参考方案1】:

您可以使用 Ritchie Lawrence 的日期函数。 它在 Gitub 上维护。 https://ritchielawrence.github.io/batchfunctionlibrary/

这里是代码。

 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
 :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

【讨论】:

漂亮,但我更喜欢 1 行而不是 12 行。 @MicheldeRuiter,2 或 14。是的,220、221。无论如何。 @MicheldeRuiter - 我更喜欢一个可行的解决方案,就像这个一样。 好消息:我将 1990 年至 2019 年 1 月的前 7 天和 12 月的最后 7 天的这个例程的结果与 getTimestamp.bat 的结果进行了比较 - 我们匹配!【参考方案2】:

没有可用于 CMD 的本机 Windows 命令可以轻松提供 ISO 8601 周数。事实上,以任何方式处理日期和时间都是一件非常痛苦的事情。

这就是我写getTimestamp.bat 的原因 - 一个用于进行日期/时间计算和格式化的通用实用程序。它是纯脚本(混合批处理/JScript),可在从 XP 开始的任何 Windows 机器上本地运行 - 无需 3rd 方 exe。

如果您需要分页帮助,可以通过getTimestamp /?getTimestamp /?? 从命令行获取完整文档。

以下将使用本地日期和时间打印 ISO 8601 周数:

call getTimeStamp /f isowk

您可以轻松地将结果存储在变量中

call getTimeStamp /f isowk /r week
echo ISO 8601 week = %week%

【讨论】:

【参考方案3】:

在批处理文件中试试这个:

@For /F %%I In ('PowerShell Get-Date -UFormat %%V') Do @Echo(%%I
@Timeout -1

或在命令提示符窗口中:

For /F %I In ('PowerShell Get-Date -UFormat %V') Do @Echo(%I

【讨论】:

好主意!每当安装 PowerShell(自 Windows 7 起)时,就是这样。 (echo 之后是故意的吗? 是的,这是故意的,但可能不需要。 (之前已确定它是跟随 echo 的最佳字符)。 大多数人使用空格或小数点,(两者都可能有问题)。 我通常在一个左括号和一个等号字符。 很抱歉-UFormat %V is not the ISO week number. @MicheldeRuiter,我从 Powershell 代码中得到与您的代码相同的结果。很抱歉,这不是 ISO 周数,但根据 dbenham,您的代码也失败了。 今天是的,试试其他日期:一团糟。我的代码仅在一年中的前几天/最后几天 (0-3) 失败。

以上是关于CMD 中的 ISO 周数的主要内容,如果未能解决你的问题,请参考以下文章

从Python中的ISO周数获取日期[重复]

如何批量删除行数中的标题

获取PHP中给定周数的第一周

如何获取 ISO-8601 GMT/UTC 年周数

将 pandas iso 周数转换为常规周数

ISO-8601 周编号与 PHP 中的“Outlook”编号