0

現在の日付 2013 年 6 月 6 日が MM/DD/YYYY と DD/MM/YYYY のどちらの形式であるかを調べる必要があります。したがって、両方とも「6」です。

私がやろうとしていたのは、現在の日付を取り、それに 3 日を追加することでした。そこから、MM フィールドが変更されないため、どれが MM フィールドであるかがわかります。日付+3日を一括で印刷する方法がわかりません。それは可能ですか?誰にもアイデアはありますか?私は数時間それに取り組んできました。GNU date コマンドを使用しようとしましたが、出力を指定する必要があるため、役に立ちません.. GRR!

これはWINDOWS用です。私が見ているファイルは変更できないので、日付が 2013 年 9 月 9 日の場合、フィールドを決定するために作業する必要があるのはそれだけです。

編集:私は次のコードを使用することになりました:それは少しやり過ぎですが、基本的にどのように行うかを見ることができます。値を設定する理由は、特定の日付に基づいて日付を提供するのが得意な Gnu date.exe コマンドと組み合わせて使用​​しているためです。したがって、スクリプトの別の場所で次のように使用します: date.exe --date "Now -90 days" %DATEFORMAT%. 別の投稿で提案されている date /T オプションを破棄する必要がありました。実際には、すべての状況で正しいデータが表示されるわけではないためです。

for /F "skip=1 tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate ^< NUL') do (
    echo.%%a|findstr /C:"/" >nul 2>&1 && set DELIM=/
    echo.%%a|findstr /C:"-" >nul 2>&1 && set DELIM=-
    echo.%%a|findstr /C:"." >nul 2>&1 && set DELIM=.

    for /F "tokens=1-3 delims=-/." %%b in ("%%a") do (
        set format=%%b%%c%%d
    )
)

if %DELIM%==/ ( 
    :: US English options 
    if %format%==Mdyyyy set DATEFORMAT=+%%-m/%%-d/%%Y 
    if %format%==Mdyy set DATEFORMAT=+%%-m/%%-d/%%y
    if %format%==MMddyy set DATEFORMAT=+%%m/%%d/%%y
    if %format%==MMddyyyy set DATEFORMAT=+%%m/%%d/%%Y
    if %format%==yyMMdd set DATEFORMAT=+%%y/%%m/%%d 

    :: UK English options
    if %format%==ddMMyyyy set DATEFORMAT=+%%d/%%m/%%Y
    if %format%==ddMMyy set DATEFORMAT=+%%d/%%m/%%y
    if %format%==dMyy set DATEFORMAT=+%%-d/%%-m/%%y

) else if %DELIM%==- (
    if %format%==yyyyMMdd set DATEFORMAT=+%%Y-%%m-%%d
    if %format%==ddMMMyy set DATEFORMAT=+%%d/%%m/%%y
    if %format%==dMyy set DATEFORMAT=+%%-d-%%-m-%%y
) else if %DELIM%==. (
    if %format%==dMyy set DATEFORMAT=+%%-d.%%-m.%%y
) else (
    echo ERROR: System was unable to identify dateformat.
    ping -n 10 -w 1 127.0.0.1 >NUL
)
4

5 に答える 5

2

すみません、このトピックについて少し混乱しています。

元の質問では、「現在の日付を取得してから 3 日を追加する」予定だったため、「現在の日付が MM/DD/YYYY と DD/MM/YYYY のどちらの形式であるかを調べる」必要がありました。私の最初の回答では、以前に要求された両方のポイントを解決しました(私はそれが正しいと思いました)。ただし、最終的に使用したコードは、まったく別の問題を解決したようです: ロケールの日付形式を特定の日付形式に変換します。これが新しいリクエストである場合、これが私の新しいソリューションです。

@echo off
setlocal EnableDelayedExpansion

rem Get the date format
for /F "skip=1 tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v 

sShortDate ^< NUL') do (
   set DATEFORMAT=%%a
)

rem Convert the special case: dd-MMM-yy to +%%d/%%m/%%y
if %DATEFORMAT% equ dd-MMM-yy (
   set DATEFORMAT=+%%d/%%m/%%y
) else (
   rem Convert the rest of cases
   for %%a in ("yyyy=%%Y" "yy=%%y" "MM=%%x" "M=%%-x" "x=m" "dd=%%x" "d=%%-x" "x=d") do (
      set DATEFORMAT=!DATEFORMAT:%%~a!
   )
)
set DATEFORMAT=+!DATEFORMAT!

ECHO %DATEFORMAT%

日付管理ルーチンは私にとって重要なので、このソリューションをテストして、希望どおりに日付形式が正しく変換されているかどうかを報告するか、変換エラーを指摘していただければ幸いです。どうもありがとう...

于 2013-06-16T08:00:30.077 に答える
1

これはタイムスタンプを取得するための地域に依存しない方法です - Win XP Pro 以降。

現在、下に YYYYMMDD_HHMMSS と YYYY-MM-DD_HH-MM-SS があります。アイテムの順序を変更して、必要なタイムスタンプを取得できます。

:: timestamp YYYYMMDD_HHMMSS
@echo off
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set dt=%%a
set dt=%dt:~0,8%_%dt:~8,6%
echo %dt%
pause

そして、再配置できる個々のアイテムを持つもの:

:: timestamp YYYY-MM-DD_HH-MM-SS
@echo off
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set dt=%%a
set dt=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2%
echo %dt%
pause
于 2013-06-06T10:13:33.670 に答える
0

Windows を使用している場合は、12 より大きいファイルC:\Windows\Tempが見つかるまで、フォルダー内のファイルをステップday実行できます。構文はわかりませんが、別のOSでも同様のアプローチを取ることができます...

@echo off

setlocal

for /f "tokens=1,2,3,4* delims=/ " %%i in ('dir c:\windows\temp /4 ^| find "M   "') do (
  if %%i gtr 2000 (if %%j gtr 12 (set _format=YYYY/DD/MM) else (if %%k gtr 12 (set _format=YYYY/MM/DD)))
  if %%j gtr 2000 (if %%i gtr 12 (set _format=DD/YYYY/MM) else (if %%k gtr 12 (set _format=MM/YYYY/DD)))
  if %%k gtr 2000 (if %%i gtr 12 (set _format=DD/MM/YYYY) else (if %%j gtr 12 (set _format=MM/DD/YYYY)))
  if defined _format goto :TheEnd
)

:TheEnd
echo %_format%

endlocal
于 2013-06-06T05:10:45.280 に答える