批次檔的日期和時間操作

 在日常的工作排程中,時間控制是少不了的,所以需要取得目前的日期和時間,而有些工作還會涉及到跨日執行,所以,記下批次檔昨天、今天、明天和時間的相關操控方式

 工作環境:
    Windows 11
        時間與地區 > 語言與地區 > 地區 > 國家與地區:臺灣 ;地區格式:推薦項目

 

#昨天、今天、明天

#如果結果不如預期,你可能要利用上述的工作環境設定,檢查一下時間與地區的相關設定,因為使用不同的設定,日期與時間表示的格式和順序可能會有所不同

@echo off
setlocal enableextensions disabledelayedexpansion

REM 獲取當前日期和時間
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "td.YY=%dt:~2,2%"
set "td.YYYY=%dt:~0,4%"
set "td.MM=%dt:~4,2%"
set "td.DD=%dt:~6,2%"

REM 去掉日期元素的補零
set /a "y=%td.YYYY%", "m=100%td.MM% %% 100", "d=(100%td.DD% %% 100)"

REM 計算今天的日期
set "today.YYYY=%y%"
set "today.YY=%y:~-2%"
set "today.MM=%m:~-2%"
set "today.DD=%d:~-2%"

REM 計算明天的日期
set /a "d+=1"
REM 計算每月的天數
set /a "ml=30+((m+m/8) %% 2)" & if %m% equ 2 set /a "ml=ml-2+(3-y %% 4)/3-(99-y %% 100)/99+(399-y %% 400)/399"
REM 如果日期超過本月最大天數,調整為下個月
if %d% gtr %ml% set /a "d=1", "m=(m %% 12)+1", "y+=1"

REM 補零並設置明天的變數
set /a "m+=100", "d+=100"
set "tomorrow.YYYY=%y%"
set "tomorrow.YY=%y:~-2%"
set "tomorrow.MM=%m:~-2%"
set "tomorrow.DD=%d:~-2%"

REM 計算昨天的日期
set /a "d-=2"
REM 如果日期小於1,調整為上個月
if %d% lss 1 (
    set /a "m=(m+10) %% 12 + 1"
    if %m% equ 12 set /a "y-=1"
    set /a "ml=30+((m+m/8) %% 2)" & if %m% equ 2 set /a "ml=ml-2+(3-y %% 4)/3-(99-y %% 100)/99+(399-y %% 400)/399"
    set /a "d=%ml%"
)

REM 補零並設置昨天的變數
set /a "m+=100", "d+=100"
set "yesterday.YYYY=%y%"
set "yesterday.YY=%y:~-2%"
set "yesterday.MM=%m:~-2%"
set "yesterday.DD=%d:~-2%"

REM 顯示今天、昨天和明天的日期,確保格式一致 (別引用成了 today 格式不一樣的)
echo Yesterday: %yesterday.YYYY%/%yesterday.MM%/%yesterday.DD%
echo Today    : %td.YYYY%/%td.MM%/%td.DD%
echo Tomorrow : %tomorrow.YYYY%/%tomorrow.MM%/%tomorrow.DD%

endlocal


 

# 配合 powershell 以便加減時間差(類 linux date 操作,可以 + - y m d h i s)

@echo off
:: powershell 加一年
:: (Get-Date).AddYears(1).ToString('yyyy-MM-dd HH:mm:ss')

:: powershell 减一年
:: (Get-Date).AddYears(-1).ToString('yyyy-MM-dd HH:mm:ss')

:: powershell 加一个月
:: (Get-Date).AddMonths(1).ToString('yyyy-MM-dd HH:mm:ss')

:: powershell 减一个月
:: (Get-Date).AddMonths(-1).ToString('yyyy-MM-dd HH:mm:ss')

:: powershell 加一天
:: (Get-Date).AddDays(1).ToString('yyyy-MM-dd HH:mm:ss')

:: powershell 减一天
:: (Get-Date).AddDays(-1).ToString('yyyy-MM-dd HH:mm:ss')

:: powershell 加一小时
:: (Get-Date).AddHours(1).ToString('yyyy-MM-dd HH:mm:ss')

:: powershell 减一小时
:: (Get-Date).AddHours(-1).ToString('yyyy-MM-dd HH:mm:ss')

:: powershell 加一分钟
:: (Get-Date).AddMinutes(1).ToString('yyyy-MM-dd HH:mm:ss')

:: powershell 减一分钟
:: (Get-Date).AddMinutes(-1).ToString('yyyy-MM-dd HH:mm:ss')

@echo off
REM 加一年
powershell -Command "(Get-Date).AddYears(1).ToString('yyyy/MM/dd HH:mm:ss')"

REM 减一年
today=powershell -Command "(Get-Date).AddYears(-1).ToString('yyyy-MM-dd')"
echo %today%

REM 加一个月
powershell -Command "(Get-Date).AddMonths(1).ToString('yyyy/MM/dd HH:mm:ss')"

REM 减一个月
powershell -Command "(Get-Date).AddMonths(-1).ToString('yyyy-MM-dd')"

REM 其他操作类似



# 日期和時間取相關欄位用

@echo off

echo %date%
:: 將/取代成空白
set Today=%date:/=%
echo %Today%

set year=%Today:~0,4%
set month=%Today:~4,2%
set day=%Today:~6,2%

echo month: %month%

:: 去除前導零
if 1%month% lss 110 (
  set month=%Today:~5,1%
)

echo year: %year%
echo month: %month%
echo day: %day%

if %month%==1 (
  set lastMonth=12
) else (
  set lastMonth=%month%-1
)
set /A lastYear=%year%-1
echo lastYear: %lastYear%
echo lastMonth: %lastMonth%

::將空白取代成0
set now=%time: =0%
set hour=%now:~0,2%
set minu=%now:~3,2%
set seco=%now:~6,2%

echo hour: %hour%
echo minute: %minu%
echo second: %seco%

:: 去除前導零
if %hour:~0,1%==0 set hour=%hour:~1%
:: 設為數值格式
set /a hourNum=%hour%
echo %hourNum%



收工!

留言

這個網誌中的熱門文章

使用 Excel 計算2個地點之間的直線距離

LINE 儲存的檔案傳到 email 不方便 很不方便 非常不方便 但是有解的筆記

Excel 子母圓餅圖