日期减去Windows批处理文件中的2位数

时间:2015-08-07 03:37:11

标签: windows batch-file

我有一个bat文件,它只生成一个日期

for /f "tokens=2,3,4 delims=/ " %%a in ('date /t') do set CurrYear=%%c

for /f "tokens=2,3,4 delims=/ " %%a in ('date /t') do set CurrMoth=%%a

for /f "tokens=2,3,4 delims=/ " %%a in ('date /t') do set CurrDay=%%b


set bDate =01/%CurrMoth%/%CurrYear%

set eDate=%CurrDay%/%CurrMoth%/%CurrYear%

set /a dayminus = %CurrDay% - 1

echo %dayminus%

pause

echo %dayminus%给出的答案是6而不是06&这是我的问题。

4 个答案:

答案 0 :(得分:0)

(有趣的是,大多数人都想知道如何走另一条道路。)发生这种情况的原因是因为批处理将以0开头的数字视为八进制,然后将它们简化为在打印为整数时丢弃0 。你可以通过将变量视为字符串来解决这个问题。

set /a dayminus=%CurrDay%-1
if %dayminus% lss 10 (
    set dayminus=0%dayminus%
)
echo %dayminus%

答案 1 :(得分:0)

如果您的目的是确保将数字保留为零填充到两个位置,您可以使用:

if %dayminus% lss 10 set dayminus=0%dayminus%

但是,您很快就会遇到另一个问题,特别是当您在本月的第一天运行时遇到的问题。但这可能是一个单独问题的问题(或者你可以看看this one)。

如果您打开使用其他工具(Windows附带,就像cmd.exe那样),那么VBScript可能是最简单的选择。你可以创建一个单行yesterdom.vbs

wscript.echo day(date()-1)

然后从你的脚本中调用它:

for /f %%a in ('cscript //nologo yesterdom.vbs') do set dayminus=%%a

如果您不想要维护单行内容的麻烦,您可以在脚本中创建和销毁它,例如:

@echo off
echo wscript.echo day(date()-1) >yesterdom.vbs
for /f %%a in ('cscript //nologo yesterdom.vbs') do set dayminus=%%a
del /q yesterdom.vbs >nul: 2>nul:
echo %dayminus%

答案 2 :(得分:0)

以下是我在示例程序中为您准备的快速解决方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_menu_01);
    ImageButton button = (ImageButton) findViewById(R.id.my_button);
    final Context context = this;
    button.setOnClickListener(new View.OnClickListner(){
        @Override
        public void onClick(View v){
            Intent intent = new Intent(context, NewActivity.class);
            startActivity(intent);
        }
    });
}

这将始终为您提供一个两位数的数字,因为当它被写入屏幕时,任何低于10的数字都会在它前面加上0。

答案 3 :(得分:0)

这是一个获得昨天日期的纯文件解决方案;它也适用于当前日期减去不到一个月的任何天数:

@echo off
setlocal EnableDelayedExpansion

rem Create array of days per month; both month and day are 100-based
set i=100
for %%a in (31 28 31 30 31 30 31 31 30 31 30 31) do (
   set /A i+=1
   set "daysPerMonth[!i!]=1%%a"
)

rem Get today's date parts (from "Dow MM/DD/YYYY" format) - 1 day
for /F "tokens=2-4 delims=/ " %%a in ('date /T') do (
   set /A MM=1%%a, DD=1%%b-1, YYYY=%%c, YYYYmod4=YYYY %% 4
)
if %YYYYmod4% equ 0 set "daysPerMonth[102]=129"

rem Adjust date if previous month
if %DD% equ 100 (
   set /A MM-=1
   if !MM! equ 100 (
      set /A MM=112, YYYY-=1
   )
   set /A DD=daysPerMonth[!MM!]
)

set "dateMinus=%DD:~1%/%MM:~1%/%YYYY%
echo %dateMinus%