Windowsバッチスクリプトで日付と時刻をフォーマットする


192

Windows(Windows XP)バッチスクリプトでは、現在の日付と時刻を後でファイル名などで使用できるようにフォーマットする必要があります。

これは、スタックオーバーフローの質問「バッチファイル日付を追加する方法」に似ていますが、時間も含まれています。

私はこれをこれまでに持っています:

echo %DATE%
echo %TIME%
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %datetimef%

それは与える:

28/07/2009
 8:35:31.01
2009_07_28__ 8_36_01

%TIME%で1桁の時間を許可する方法はありますか?

2009_07_28__08_36_01



datetimef変数の空のスペースを置き換え、代わりに0を置くことができます。あなたの例では:SET datetimef=%datetimef: =0%
SebaGra

回答:


148

私はこのスクリプトで終わりました:

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
echo secs=%secs%

set year=%date:~-4%
echo year=%year%

:: WIN2008R2では、たとえば、「月を設定する=%date:〜3,2%」を以下のようにする必要があります::それ以外の場合、MONTHには00が表示されます

set month=%date:~4,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
echo month=%month%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
echo day=%day%

set datetimef=%year%%month%%day%_%hour%%min%%secs%

echo datetimef=%datetimef%

11
ちなみに、Windows Server 2003とWindows 7では、このスクリプトによって "201200Mo_085806"(正しい年と時刻)が得られました。
sfuqua

50
Googleからここに来る人(私のように)への注意:これはロケールに依存しているため、英語以外のWindowsで作業するには微調整が必​​要な場合があります。
PiotrK 2013年

私はこのようにしました:Time / T> Time.dat set / P ftime = <Time.dat set fDate =%date:〜6 %% date:〜3,2 %% date:〜0,2 %% ftime: 〜0,2 %% ftime:〜3,2%echo%fDate%-> 201310170928
Ice

%time:〜0,2%は何をしますか:〜、%構造に関するドキュメントはどこにありますか?
user1605665 2014

6
これはすべて、通常の文字列置換を使用して2行で実行できます。stackoverflow.com
Andreas

71
@ECHO OFF
: Sets the proper date and time stamp with 24Hr Time for log file naming
: convention

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%

PAUSE

2
Windows Server 2003およびWindows 7では、これにより正しい文字列が得られました。過去に作成したものよりもはるかにエレガントなので、ありがとうございます!
sfuqua

3
これは、ロシア語のロケールを持つWindows 7で私に与えられるものです。現在の時刻は2013-05-03T02:22:51ですが、スクリプトは次のように出力します: "2013-5.-01_02_22_51"
ナイトコーダー

7
%date%は、異なるロケールで異なる文字列を提供します。
AechoLiu 2013年

2
20146.0._173502を返します(チェコ

2
win7 64ビットアルティメット、誤った時間:20140.01_131612、(2014.10.26_131612)
waza123 '26

66

これは、ログファイル名を生成する方法です(http://ss64.com/nt/syntax-getdate.htmlに基づく):

@ECHO OFF
:: Check WMIC is available
WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error

:: Use WMIC to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
   IF "%%~L"=="" goto s_done
      Set _yyyy=%%L
      Set _mm=00%%J
      Set _dd=00%%G
      Set _hour=00%%H
      SET _minute=00%%I
      SET _second=00%%K
)
:s_done

:: Pad digits with leading zeros
      Set _mm=%_mm:~-2%
      Set _dd=%_dd:~-2%
      Set _hour=%_hour:~-2%
      Set _minute=%_minute:~-2%
      Set _second=%_second:~-2%

Set logtimestamp=%_yyyy%-%_mm%-%_dd%_%_hour%_%_minute%_%_second%
goto make_dump

:s_error
echo WMIC is not available, using default log filename
Set logtimestamp=_

:make_dump
set FILENAME=database_dump_%logtimestamp%.sql
...

5
バッチでのロケールに依存しないタイムスタンプ生成に関する質問については、SOでの最良の回答です。
マイクキャンベル

2
驚くばかり!これを解決策としてマークする方法があるはずです
Rado

48

私は通常、日付/時刻の文字列が必要なときはいつでも、このようにします。

set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
set dt=%dt: =0%

これは、ドイツ語の日付/時刻形式(dd.mm.yyyy hh:mm:ss)用です。基本的に私は部分文字列を連結し、最後にすべてのスペースをゼロに置き換えます。

サブストリングの仕組みの簡単な説明:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

したがって、「2018.03.2018」のような日付からちょうど1年を取得するには、次のようにします。

%DATE:~6,4%
       ^-----skip 6 characters
         ^---keep 4 characters 

7
クリーンなタイムスタンプ(スペースや他の文字なし)が必要な場合に、最もエレガントなソリューション
jvdneste

1
mrtを共有してくれてありがとう@jvdnesteにこれ以上同意できませんでした
this.user3272243

1
絶対にすばらしい-機能します[必要な構文は非常に混乱しますが、それはポスターの問題ではありません]
JosephDoggie

38

PowerShellがインストールされている場合は、次のように、希望する任意の形式で日付/時刻を簡単かつ確実に取得できます。

for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a
move "%oldfile%" "backup-%datetime%"

もちろん、現在PowerShellは常にインストールされていますが、Windows XPでは、PSが利用可能であることがわかっている既知の環境でバッチスクリプトが使用されている場合(またはPowerShellが利用可能な場合はバッチファイルをチェックインする場合)にのみ、この手法を使用することになるでしょう。 ...)

あなたが合理的に尋ねるかもしれません:なぜPowerShellを使用して日付/時刻を取得できるのにバッチファイルを使用するのですか?しかしいくつかの明白な理由は次のとおりです:バッチファイルを使用した昔ながらの方法、または(b)古いスクリプトを更新していて、全体をPSに移植したくない場合。


(a)私の場合、これは完全に機能します(batは私の環境でのみ使用できますが、異なるPCでロケールが混在しています)。ありがとうございました!
ccalboni 2017

30

私は今日この問題に遭遇し、それで解決しました:

SET LOGTIME=%TIME: =0%

スペースを0に置き換え、基本的に時間にゼロを埋めます。

少し検索した後、コマンド拡張が必要かどうかはわかりませんでした(まだSETLOCAL DISABLEEXTENSIONSで機能していました)。


OK、変数の置換。さて-コロン(:)を置き換える方法は?
Tomasz Gandor 2017

@TomaszGandorこれは私にとってはうまくいきますecho %TIME: =:%が、そうでない場合はライクでエスケープし:てみてください(これも私にとってはうまくいき ます)。^echo %TIME: =^:%
opello

1
単純化のために+1。コロンはファイル名では無効です。set theTime =%Time :: =%はそれらを削除します。1つのステートメントで、スペースを0に置き換え、コロンを削除し、6文字に切り捨てることができます(したがって、小数部分が削除されます)。2行または3行かかる場合、それほど大きな問題ではありません。気になるだけです。
riderBill 2018年

私が知っていることではありません。見つけたらフォローアップしてください!
opello 2018年

21

既に述べたように、日付と時刻の解析は、現在のユーザーが使用している形式(たとえば、MM / dd / yyまたはdd-MM-yyyy)を知っている場合にのみ役立ちます。これは判断できますが、すべてのストレスと解析を実行するまでに、予期しないフォーマットが使用され、さらに調整が必要になるという状況に陥ります。

希望する形式で日付スラッグを返す外部プログラムを使用することもできますが、スクリプト/バッチでユーティリティプログラムを配布する必要があるという欠点があります。

かなり生の方法でCMOSクロックを使用するバッチトリックもありますが、それはほとんどの人にとって裸線に近すぎ、日付/時刻を取得するのに常に好ましい場所であるとは限りません。

以下は、上記の問題を回避するソリューションです。はい、それは他のいくつかの問題を引き起こしますが、私の目的のために、これは現代のWindowsシステムの.batファイルで日付スタンプを作成するための最も簡単で最も明確な、最もポータブルなソリューションであることがわかりました。これは単なる例ですが、他の日付や時刻の形式などを変更する方法がわかると思います。

reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f
@REM reg query "HKCU\Control Panel\International" /v sShortDate
set LogDate=%date%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f

3
まさに私が探していたもの。すべてのロケール設定で機能するもの。ありがとう!
Lost_DM

私たちが対処できる「最新のWindowsシステム」の+1 :)冗談はさておき、これは非常に独創的であり、あなたが言ったように、この問題に対処するためのポータブルな方法です。
Zach Young

9
これはひどい解決策です。失敗した場合、グローバル設定は永久に変更されます。また、他のアプリケーションとの競合状態も紹介します。
MikeKulls 2015

reg query "HKCU\Control Panel\International" /v sShortDateレジストリ設定を変更せずにパーツを使用できます(読者に任せてください!)。
トリカス

9

次は直接的な答えではないかもしれませんが、近い答えですか?

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__0%time:~1,2%_%time:~3,2%_%time:~6,2%
else set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%

少なくとも刺激的かもしれません。


9

この形式が正確に必要ない場合:

2009_07_28__08_36_01

次に、%date%と%time%を使用する次の3行のコードを使用できます。

set mydate=%date:/=%
set mytime=%time::=%
set mytimestamp=%mydate: =_%_%mytime:.=_%

注:文字/:は削除され、文字.とスペースはアンダースコアに置き換えられます。

出力例(水曜日8/5 / 15、12:49 PMに50秒と93ミリ秒で取得):

echo %mytimestamp%
Wed_08052015_124950_93

時間が12未満の場合、set mydate =%date:/ =%set mytime =%time :: =%set mytime =%mytime:= 0%set mytimestamp =%mydate:= _%_%mytime:。= _ %
ragche 2017

8
REM Assumes UK style date format for date environment variable (DD/MM/YYYY).
REM Assumes times before 10:00:00 (10am) displayed padded with a space instead of a zero.
REM If first character of time is a space (less than 1) then set DATETIME to:
REM YYYY-MM-DD-0h-mm-ss
REM Otherwise, set DATETIME to:
REM YYYY-MM-DD-HH-mm-ss
REM Year, month, day format provides better filename sorting (otherwise, days grouped
REM together when sorted alphabetically).

IF "%time:~0,1%" LSS "1" (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-0%time:~1,1%-%time:~3,2%-%time:~6,2%
) ELSE (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
)

ECHO %DATETIME%

6

offset:lengthでサポート書式設定SET、Windowsのコマンドパッドにあなたを許しません0、あなたが興味を持っているように見えるよう。

しかし、あなたは時間未満であることを確認するためにバッチスクリプトをコーディングすることができます10し、
異なるとそれに応じてパッドechoの文字列。

あなたはいくつかありますについてはSET、このリンク上でコマンドを


ここに到達するために、他のプログラミング方法に変更することもできます。

unix bash(WindowsのCygwinで利用可能)では、次のように言うのは非常に簡単です。

date +%Y_%m_%d__%H_%M_%S

そして、それは常に正しくパディングします。


6

私はこのようにしました:

REM Generate FileName from date and time in format YYYYMMTTHHMM

Time /T > Time.dat
set /P ftime= < Time.dat

set FileName=LogFile%date:~6%%date:~3,2%%date:~0,2%%ftime:~0,2%%ftime:~3,2%.log

echo %FileName%

LogFile201310170928.log


英語版サーバー(OS名:Microsoft(R)Windows(R)Server 2003 Standard x64 Edition、OS Version:5.2.3790 Service Pack 2 Build 3790)
Ice

1
また、ドイツ語のサーバー(Betriebssystemname:Microsoft®WindowsServer®2008 Enterprise、Betriebssystemversion:6.0.6002 Service Pack 2 Build 6002)でもテストされています
Ice

1
これでも問題ありません:(Betriebssystemname:Microsoft Windows Server 2012 Standard、Betriebssystemversion:6.2.9200 Nicht zutreffend Build 9200)
Ice

4
::========================================================================  
::== CREATE UNIQUE DATETIME STRING IN FORMAT YYYYMMDD-HHMMSS   
::======= ================================================================  
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a  
SET DATETIME=%DTS:~0,8%-%DTS:~8,6%  

最初の行は常に次の形式でタイムゾーンに
応じ
て出力します:20150515150941.077000 + 120 これにより、希望に合わせて出力をフォーマットするだけです。


4

このbatファイル(datetimestr.batとして保存)は、datetime文字列を3回生成します:(1)曜日と秒を含む長いdatetime文字列、(2)それらなしの短いdatetime文字列、および(3)コードの短いバージョン。

@echo off
REM "%date: =0%" replaces spaces with zeros
set d=%date: =0%
REM "set yyyy=%d:~-4%" pulls the last 4 characters
set yyyy=%d:~-4%
set mm=%d:~4,2%
set dd=%d:~7,2%
set dow=%d:~0,3%
set d=%yyyy%-%mm%-%dd%_%dow%

set t=%TIME: =0%
REM "%t::=%" removes semi-colons
REM Instead of above, you could use "%t::=-%" to 
REM replace semi-colons with hyphens (or any 
REM non-special character)
set t=%t::=%
set t=%t:.=%

set datetimestr=%d%_%t%
@echo  Long date time str = %datetimestr%

set d=%d:~0,10%
set t=%t:~0,4%
set datetimestr=%d%_%t%
@echo Short date time str = %datetimestr%


@REM Short version of the code above
set d=%date: =0%
set t=%TIME: =0%
set datetimestr=%d:~-4%-%d:~4,2%-%d:~7,2%_%d:~0,3%_%t:~0,2%%t:~3,2%%t:~6,2%%t:~9,2%
@echo Datetimestr = %datetimestr%

pause

適切なクレジットを与えるために、私はピーターモーテンセン(14年6月18日21:02)とオペロ(11月25日14:27)の概念をマージしました。

これはもっと短く書くことができますが、この長いバージョンではコードの読み取りと理解が容易になります。


4

私は本当にバッチファイルが初めてで、これが私のコードです!! (理由はわかりませんが、日付/ t時刻/ tを組み合わせることはできず、%date%%time%を変数なしで直接使用することもできませんでした...)

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
EXIT

これは、他の人から再利用されたようなものです(問題は、ファイル名として使用するフォーマットされた日時を取得することでした)。


4

それを行う別の簡単な方法があります:

set HH=%time:~0,2%
if %HH% LEQ 9 (
set HH=%time:~1,1%
)

3

YYYY-MM-DD hh:mm:ss私が使用する(24時間)タイムスタンプを生成するには:

SET CURRENTTIME=%TIME%
IF "%CURRENTTIME:~0,1%"==" " (SET CURRENTTIME=0%CURRENTTIME:~1%)
FOR /F "tokens=2-4 delims=/ " %%A IN ('DATE /T') DO (SET TIMESTAMP=%%C-%%A-%%B %CURRENTTIME%)

特定の地域設定を想定していますか?
Peter Mortensen

1
ss64.com/nt/syntax-variables.htmlによると、%TIME%%DATE%変数はそれぞれTIMEDATEコマンドと同じ形式を使用しています。私のシステムでは、変数が地域の設定と一致しません。
M.ダドリー2014年

3

このバッチスクリプトは、OPが要求することを正確に実行します(Windows XP SP3でテスト済み)。

私は以前に「jph」で説明された賢いレジストリトリックも使用しました。これは、IMHOが日付の100%一貫したフォーマットを取得する最も簡単な方法です "yyyy_MM_dd"新旧のWindowsシステムで。これを行うための1つのレジストリ値の変更は、一時的で簡単です。数ミリ秒しか続かないため、すぐに元に戻ります。

インスタントデモのこのバッチファイルをダブルクリックすると、コマンドプロンプトウィンドウがポップアップしてタイムスタンプが表示されます。。。。。

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: generates a custom formatted timestamp string using date and time.
:: run this batch file for an instant demo.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@ECHO OFF
SETLOCAL & MODE CON:COLS=80 LINES=15 & COLOR 0A

:: --- CHANGE THE COMPUTER DATE FORMAT TEMPORARILY TO MY PREFERENCE "yyyy_MM_dd",
REG COPY "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f 2>nul >nul
REG ADD "HKCU\Control Panel\International" /v sShortDate /d "yyyy_MM_dd" /f 2>nul >nul

SET MYDATE=%date%

:: --- REVERT COMPUTER DATE BACK TO SYSTEM PREFERENCE
REG COPY "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f 2>nul >nul
REG DELETE "HKCU\Control Panel\International-Temp" /f 2>nul >nul

:: --- SPLIT THE TIME [HH:MM:SS.SS] TO THREE SEPARATE VARIABLES [HH] [MM] [SS.SS]
FOR /F "tokens=1-3 delims=:" %%A IN ('echo %time%') DO (
SET HOUR=%%A
SET MINUTES=%%B
SET SECONDS=%%C
)

:: --- CHOOSE ONE OF THESE TWO OPTIONS :
:: --- FOR 4 DIGIT SECONDS        //REMOVES THE DOT FROM THE SECONDS VARIABLE [SS.SS]
:: SET SECONDS=%SECONDS:.=%
:: --- FOR 2 DIGIT SECONDS        //GETS THE FIRST TWO DIGITS FROM THE SECONDS VARIABLE [SS.SS]
SET SECONDS=%SECONDS:~0,2% 

:: --- FROM 12 AM TO 9 AM, THE HOUR VARIABLE WE EXTRACTED FROM %TIME% RETURNS A SINGLE DIGIT, 
:: --- WE PREFIX A ZERO CHARACTER TO THOSE CASES, SO THAT OUR WANTED TIMESTAMP
:: --- ALWAYS GENERATES DOUBLE-DIGIT HOURS (24-HOUR CLOCK TIME SYSTEM).
IF %HOUR%==0 (SET HOUR=00)
IF %HOUR%==1 (SET HOUR=01)
IF %HOUR%==2 (SET HOUR=02)
IF %HOUR%==3 (SET HOUR=03)
IF %HOUR%==4 (SET HOUR=04)
IF %HOUR%==5 (SET HOUR=05)
IF %HOUR%==6 (SET HOUR=06)
IF %HOUR%==7 (SET HOUR=07)
IF %HOUR%==8 (SET HOUR=08)
IF %HOUR%==9 (SET HOUR=09)

:: --- GENERATE OUR WANTED TIMESTAMP
SET TIMESTAMP=%MYDATE%__%HOUR%_%MINUTES%_%SECONDS%

:: --- VIEW THE RESULT IN THE CONSOLE SCREEN
ECHO.
ECHO    Generate a custom formatted timestamp string using date and time.
ECHO.
ECHO    Your timestamp is:    %TIMESTAMP%
ECHO.
ECHO.
ECHO    Job is done. Press any key to exit . . .
PAUSE > NUL

EXIT

Windows 2019でも動作します。私はあなたの解決策を維持します、私はそれが好きです:)
user225479

質問、私はちょうど真夜中の後、末尾の「0」が出力にドロップされることを発見しました。なぜ今のアイデア?スクリプトを使用した私の出力は次のようになります。タイムスタンプは:..00_58_07ではなく2019_09_16__0_58_07です。ただし、1時以降は期待どおりに動作します(出力は..01_01_56になります)。
user225479

ELSEステートメントにIF%HOUR%== 0(SET HOUR = 00)を追加しました。それで問題が解決するはずです。:)
user225479

フィードバック@ user225479をありがとう。コードを修正しました。24時間形式に変換されたHOUR変数のすべての可能な順列が正しく機能するようになりました。見やすいようにレイアウトも変更しました。
derty2

2
set hourstr = %time:~0,2%
if "%time:~0,1%"==" " (set hourstr=0%time:~1,1%)
set datetimestr=%date:~0,4%%date:~5,2%%date:~8,2%-%hourstr%%time:~3,2%%time:~6,2%

2

「search_files.bat」というファイルを作成し、以下の内容をファイルに入れます。次に、それをダブルクリックします。AMを適切に処理するために、一時的な%THH%変数が配置されました。時間の最初の2桁に0がある場合、WindowsはLOGファイルの残りのファイル名を無視します。

CD .
SET THH=%time:~0,2%
SET THH=%THH: =0%
dir /s /b *.* > %date:~10,4%-%date:~4,2%-%date:~7,2%@%THH%.%time:~3,2%.%time:~6,2%.LOG

2

@The loraxに加えて短いバージョンが好きですが、他の言語設定では少し異なる場合があります。

たとえば、ドイツ語の設定(自然な日付形式:dd.mm.yyyy)では、月のクエリを4,2から3,2に変更する必要があります。

@ECHO OFF
: Sets the proper date and time stamp with 24h time for log file naming convention i.e.

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~3,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~3,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%
: Outputs= 20160727_081040
: (format: YYYYMMDD_HHmmss; e.g.: the date-output of this post timestamp)

PAUSE

1

これは私の2セントですdatetime string。上のMM DD YYYYシステム第一及び第二のスイッチ%DATE:~のエントリを。

    REM ====================================================================================
    REM CREATE UNIQUE DATETIME STRING FOR ADDING TO FILENAME
    REM ====================================================================================
    REM Can handle dd DDxMMxYYYY and DDxMMxYYYY > CREATES YYYYMMDDHHMMSS (x= any character)
    REM ====================================================================================
    REM CHECK for SHORTDATE dd DDxMMxYYYY 
    IF "%DATE:~0,1%" GTR "3" (
        SET DATETIME=%DATE:~9,4%%DATE:~6,2%%DATE:~3,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
    ) ELSE (
    REM ASSUMES SHORTDATE DDxMMxYYYY
        SET DATETIME=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
        )
    REM CORRECT FOR HOURS BELOW 10
    IF %DATETIME:~8,2% LSS 10 SET DATETIME=%DATETIME:~0,8%0%DATETIME:~9,5%
    ECHO %DATETIME%

1

私は受け入れられた答えを試しました、そしてそれはかなりうまくいきます。残念ながら、米国時間形式はH:MM:SS.CSのように見え、前部に0がないため、午前10時より前に解析の問題が発生していました。このハードルを乗り越えて、ほとんどすべての世界の時刻形式の解析を可能にするために、非常にうまく機能しているように見えるこの単純なルーチンを思いつきました。

:ParseTime
rem The format of %%TIME%% is H:MM:SS.CS or (HH:MM:SS,CS) for example 0:01:23.45 or 23:59:59,99
FOR /F "tokens=1,2,3,4 delims=:.," %%a IN ("%1") DO SET /A "%2=(%%a * 360000) + (%%b * 6000) + (%%c * 100) + %%d"
GOTO :EOF

このルーチンの良い点は、最初のパラメーターとして時間文字列を渡し、2番目のパラメーターとして時間(センチ秒単位)を含めたい環境変数の名前を渡すことです。例えば:

CALL :ParseTime %START_TIME% START_CS
CALL :ParseTime %TIME% END_CS
SET /A DURATION=%END_CS% - %START_CS%

(*クリス*)


1

多分このようなもの:

@call:DateTime

@for %%? in (
    "Year   :Y"
    "Month  :M"
    "Day    :D"
    "Hour   :H"
    "Minutes:I"
    "Seconds:S"
) do @for /f "tokens=1-2 delims=:" %%# in (%%?) do @for /f "delims=" %%_ in ('echo %%_DT_%%$_%%') do @echo %%# : _DT_%%$_ : %%_

:: OUTPUT
:: Year    : _DT_Y_ : 2014
:: Month   : _DT_M_ : 12
:: Day     : _DT_D_ : 17
:: Hour    : _DT_H_ : 09
:: Minutes : _DT_I_ : 04
:: Seconds : _DT_S_ : 35

@pause>nul

@goto:eof

:DateTime
    @verify errorlevel 2>nul & @wmics Alias /? >nul 2>&1
    @if not errorlevel 1 (
        @for /f "skip=1 tokens=1-6" %%a in ('wmic path win32_localtime get day^,hour^,minute^,month^,second^,year /format:table') do @if not "%%f"=="" ( set "_DT_D_=%%a" & set "_DT_H_=%%b" & set "_DT_I_=%%c" & set "_DT_M_=%%d" & set "_DT_S_=%%e" & set "_DT_Y_=%%f" )
    ) else (
        @set "_DT_T_=1234567890 "
    )
    @if errorlevel 1 (
        @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "Y" "M" "D" "H" "I" "S") do @set "_DT_%%~?_=%%~?"
        @for %%? in ("Date" "Time") do @for /f "skip=2 tokens=1,3" %%a in ('reg query "HKCU\Control Panel\International" /v ?%%~? 2^>nul') do @for /f %%x in ('echo:%%_DT_%%a_%%') do @if "%%x"=="%%a" set "_DT_%%a_=%%b"
        @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_T_=%%a%%b%%c"
    )
    @if errorlevel 1 (
        @if "%_DT_iDate_%"=="0" (set "_DT_F_=_DT_D_ _DT_Y_ _DT_M_") else if "%_DT_iDate_%"=="1" (set "_DT_F_=_DT_D_ _DT_M_ _DT_Y_") else if "%_DT_iDate_%"=="2" (set "_DT_F_=_DT_Y_ _DT_M_ _DT_D_")
        @for /f "tokens=1-4* delims=%_DT_sDate_%" %%a in ('date/t') do @for /f "tokens=1-3" %%x in ('echo:%%_DT_F_%%') do @set "%%x=%%a" & set "%%y=%%b" & set "%%z=%%c"
        @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_H_=%%a" & set "_DT_I_=%%b" & set "_DT_S_=%%c"
        @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "T") do @set "_DT_%%~?_="
    )
    @for %%i in ("Y"                ) do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=  0 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-4%%"') do @set "_DT_%%~i_=%%~k"
    @for %%i in ("M" "D" "H" "I" "S") do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=100 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-2%%"') do @set "_DT_%%~i_=%%~k"
@exit/b

1

このような状況では、単純な標準プログラミングアプローチを使用します。不明なエンティティの解析に多大な労力を費やす代わりに、現在の構成を保存し、既知の状態にリセットし、情報を抽出して、元の状態に復元します。標準のWindowsリソースのみを使用してください。

具体的には、日付と時刻の形式は、レジストリキーHKCU \ Control Panel \ International \の[MS定義]の「値」の「sTimeFormat」と「sShortDate」に格納されています。Regは、すべてのWindowsバージョンに含まれているコンソールレジストリエディターです。HKCUキーを変更するために昇格された特権は必要ありません

Prompt $N:$D $T$G

::Save current config to a temporary (unique name) subkey, Exit if copy fails
Set DateTime=
Set ran=%Random%
Reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp%ran%" /f
If ErrorLevel 1 GoTO :EOF

::Reset the date format to your desired output format (take effect immediately)
::Resetting the time format is useless as it only affect subsequent console windows
::Reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH_mm_ss"   /f
Reg add "HKCU\Control Panel\International" /v sShortDate  /d "yyyy_MM_dd" /f

::Concatenate the time and (reformatted) date strings, replace any embedded blanks with zeros
Set DateTime=%date%__%time:~0,2%_%time:~3,2%_%time:~6,2%
Set DateTime=%DateTime: =0%

::Restore the original config and delete the temp subkey, Exit if restore fails
Reg copy   "HKCU\Control Panel\International-Temp%ran%" "HKCU\Control Panel\International" /f
If ErrorLevel 1 GoTO :EOF
Reg delete "HKCU\Control Panel\International-Temp%ran%" /f

シンプルでわかりやすく、すべての地域で機能するはずです。

理解できない理由により、「sShortDate」値のリセットはコンソールウィンドウですぐに有効になりますが、非常に類似した「sTimeFormat」値のリセットは、新しいコンソールウィンドウが開かれるまで有効になりませ。ただし、変更できるのは区切り文字のみです。桁位置は固定されています。同様に、 "HH"タイムトークンは先頭のゼロを付加すると想定されていますが、そうではありません。幸い、回避策は簡単です。


-1「先行ゼロを追加する代わりに、マシン構成を中断して、ランダムなニーズに変更してから、どうしますか?」このアプローチはこの世界の外にあり、かなりの労力を必要とし、望ましくない結果が無限に続く可能性があります。そして、私は読みやすさと標準の予想されるコードの振る舞いについての議論を始めたくありません。称賛。
vaitrafra 2016

sTimeFormat時間形式をリセットしても意味がありません。いいえ。後続のコンソールプロンプトに影響するため、次を使用して適用しますfor /f "delims=" %%G in ('cmd /C echo SET "DateTime=%%date%%__%%time%%"') do %%G
JosefZ

1

このスクリプトは、WMICツールを介してプライマリにアクセスするWMIインターフェイスを使用します。これは、Windows XP Professional以降のWindowsの不可欠な部分です(Homeエディションもサポートされていますが、ツールはデフォルトではインストールされません)。このスクリプトは、WMIインターフェイスにアクセスし、WMICツールが提供するのと同じ形式で時間をコンソール出力に書き込むためのWSH vbscriptを作成して呼び出すことにより、不足しているWMICツールの回避策も実装します。

@ECHO OFF
REM Returns: RETURN
REM Modify:  RETURN, StdOut
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond

CALL :getTime %*
ECHO %RETURN%
GOTO :EOF


REM SUBROUTINE
REM Returns: RETURN
REM Modify:  RETURN
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond
:getTime
  SETLOCAL EnableDelayedExpansion
    SET DELIM=-
    WHERE /Q wmic.exe
    IF NOT ERRORLEVEL 1 FOR /F "usebackq skip=1 tokens=*" %%x IN (`wmic.exe os get LocalDateTime`) DO (SET DT=%%x & GOTO getTime_Parse)
    SET _TMP=%TEMP:"=%
    ECHO Wscript.StdOut.WriteLine (GetObject("winmgmts:root\cimv2:Win32_OperatingSystem=@").LocalDateTime)>"%_TMP%\get_time_local-helper.vbs"
    FOR /F "usebackq tokens=*" %%x IN (`cscript //B //NoLogo "%_TMP%\get_time_local-helper.vbs"`) DO (SET DT=%%x & GOTO getTime_Parse)
    :getTime_Parse
      SET _RET=
      IF "%1" EQU "" (
        SET _RET=%DT:~0,4%%DELIM%%DT:~4,2%%DELIM%%DT:~6,2%%DELIM%%DT:~8,2%%DELIM%%DT:~10,2%%DELIM%%DT:~12,2%%DELIM%%DT:~15,3%
      ) ELSE (
        REM Not recognized format strings are ignored during parsing - no error is reported.
       :getTime_ParseLoop
         SET _VAL=
         IF "%1" EQU "YYYY" SET _VAL=%DT:~0,4%
         IF "%1" EQU "MM"   SET _VAL=%DT:~4,2%
         IF "%1" EQU "DD"   SET _VAL=%DT:~6,2%
         IF "%1" EQU "hh"   SET _VAL=%DT:~8,2%
         IF "%1" EQU "mm"   SET _VAL=%DT:~10,2%
         IF "%1" EQU "ss"   SET _VAL=%DT:~12,2%
         IF "%1" EQU "ms"   SET _VAL=%DT:~15,3%
         IF DEFINED _VAL (
           IF DEFINED _RET (
             SET _RET=!_RET!%DELIM%!_VAL!
           ) ELSE (
             SET _RET=!_VAL!
           )
         )
         SHIFT
         IF "%1" NEQ "" GOTO getTime_ParseLoop
      )
  ENDLOCAL & SET RETURN=%_RET%
GOTO :EOF

1

初期の変数展開を回避するための優れた単一行のトリックは、 cmd /c echo ^%time^%

cmd /c echo ^%time^% & dir /s somelongcommand & cmd /c echo ^%time^%

0
:: =============================================================
:: Batch file to display Date and Time seprated by undescore.
:: =============================================================
:: Read the system date.
:: =============================================================
@SET MyDate=%DATE%
@SET MyDate=%MyDate:/=:%
@SET MyDate=%MyDate:-=:%
@SET MyDate=%MyDate: =:%
@SET MyDate=%MyDate:\=:%
@SET MyDate=%MyDate::=_%
:: =============================================================
:: Read the system time.
:: =============================================================
@SET MyTime=%TIME%
@SET MyTime=%MyTime: =0%
@SET MyTime=%MyTime:.=:%
@SET MyTime=%MyTime::=_%
:: =============================================================
:: Build the DateTime string.
:: =============================================================
@SET DateTime=%MyDate%_%MyTime%
:: =============================================================
:: Display the Date and Time as it is now.
:: =============================================================
@ECHO MyDate="%MyDate%" MyTime="%MyTime%" DateTime="%DateTime%"
:: =============================================================
:: Wait before close.
:: =============================================================
@PAUSE
:: =============================================================

0

ファイル名で使用する数値日付の非常に単純なソリューションでは、次のコードを使用します。

set month=%date:~4,2%
set day=%date:~7,2%
set curTimestamp=%month%%day%%year%

rem then the you can add a prefix and a file extension easily like this
echo updates%curTimestamp%.txt

0

日付コマンドの結果をスラッシュで分割すると、各トークンを適切な変数に移動できます。

FOR /F "tokens=1-3 delims=/" %%a IN ("%date:~4%") DO (
SET _Month=%%a
SET _Day=%%b
SET _Year=%%c
)
ECHO Month %_Month%
ECHO Day %_Day%
ECHO Year %_Year%
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.