Mettre en forme la date et l'heure dans un script batch Windows

193

Dans un script batch Windows (Windows XP), je dois formater la date et l'heure actuelles pour une utilisation ultérieure dans les noms de fichiers, etc.

Il est similaire à la question Stack Overflow Comment ajouter une date dans des fichiers de commandes , mais aussi avec l'heure.

J'ai ceci jusqu'à présent:

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%

qui donne:

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

Existe-t-il un moyen de permettre une heure à un seul chiffre en% TIME%, afin que je puisse obtenir ce qui suit?

2009_07_28__08_36_01
Laurie
la source
Vous pouvez remplacer les espaces vides sur votre datetimefvariable et mettre des 0 à la place. Sur votre exemple:SET datetimef=%datetimef: =0%
SebaGra le

Réponses:

148

J'ai fini avec ce script:

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%

:: Sur WIN2008R2, par exemple, j'avais besoin de faire de votre 'set month =% date: ~ 3,2%' comme ci-dessous :: sinon 00 apparaît pour MOIS

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%
Laurie
la source
11
Pour info, sur Windows Server 2003 et sur Windows 7, ce script m'a donné "201200Mo_085806" (année et heure correctes).
sfuqua
50
Comme note pour quelqu'un qui viendra ici de Google (comme moi): Cela dépend de la locale, donc cela peut nécessiter des ajustements pour fonctionner sur Windows non anglais!
PiotrK
je l'ai fait de cette façon: 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
Que fait% time: ~ 0,2% où se trouve une documentation sur la structure: ~,%?
user1605665
6
Tout cela peut être fait en seulement 2 lignes en utilisant le remplacement de chaîne ordinaire: stackoverflow.com/a/23558738/1879699
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
qc
la source
2
Sur Windows Server 2003 et Windows 7, cela m'a donné la chaîne correcte. Beaucoup plus élégant que ce que j'ai construit dans le passé, alors merci!
sfuqua
3
Voici ce que cela me donne dans Windows 7 avec la langue russe. L'heure actuelle est 2013-05-03T02: 22: 51, mais le script affiche: "2013-5.-01_02_22_51"
nightcoder
7
Le% date% donnera une chaîne différente avec des paramètres régionaux différents.
AechoLiu
2
renvoie 20146.0._173502 pour moi (locale tchèque)
Muflix
2
win7 64bit ultime, heure incorrecte: 20140.01_131612, doit être (2014.10.26_131612)
waza123
67

Voici comment je génère un nom de fichier journal (basé sur 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
...
codeur de nuit
la source
5
meilleure réponse sur SO pour les questions sur la génération d'horodatage indépendant des paramètres régionaux par lots.
Mike Campbell
2
Impressionnant! Il devrait y avoir un moyen de marquer cela comme la solution
Rado
49

Je le fais généralement de cette façon chaque fois que j'ai besoin d'une chaîne de date / heure:

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

Ceci est pour le format de date / heure allemand (jj.mm.aaaa hh: mm: ss). Fondamentalement, je concatène les sous-chaînes et remplace enfin tous les espaces par des zéros.

Brève explication du fonctionnement des sous-chaînes:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

Donc, pour obtenir uniquement l'année à partir d'une date comme "29.03.2018", utilisez:

%DATE:~6,4%
       ^-----skip 6 characters
         ^---keep 4 characters 
Andreas
la source
7
de loin la solution la plus élégante lorsque vous avez juste besoin d'un horodatage propre (pas d'espaces ni d'autres caractères)
jvdneste
1
Je ne pourrais pas être plus d'accord avec @jvdneste merci pour le partage de mrt
this.user3272243
1
absolument génial - et fonctionne [la syntaxe requise est très déroutante, mais ce n'est guère le problème de l'affiche]
JosephDoggie
38

Si PowerShell est installé, vous pouvez facilement et de manière fiable obtenir la date / heure dans le format de votre choix, par exemple:

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

Bien sûr, de nos jours, PowerShell est toujours installé, mais sur Windows XP, vous ne souhaiterez probablement utiliser cette technique que si votre script de traitement par lots est utilisé dans un environnement connu où vous savez que PS est disponible (ou archivez votre fichier de commandes si PowerShell est disponible ...)

Vous pouvez raisonnablement demander: pourquoi utiliser un fichier de commandes si vous pouvez utiliser PowerShell pour obtenir la date / l'heure, mais je pense que certaines raisons évidentes sont: (a) vous n'êtes pas très familier avec PowerShell et préférez toujours faire la plupart les choses à l'ancienne avec des fichiers batch ou (b) vous mettez à jour un ancien script et vous ne voulez pas porter le tout sur PS.

G. Lombard
la source
(a) dans mon cas, et cela fonctionne parfaitement (bat est uniquement pour mon environnement mais j'ai mélangé des locales sur différents PC). Je vous remercie!
ccalboni
30

Je suis tombé sur ce problème aujourd'hui et je l'ai résolu avec:

SET LOGTIME=%TIME: =0%

Il remplace les espaces par des 0 et met à zéro l'heure.

Après quelques recherches rapides, je n'ai pas découvert si cela nécessitait des extensions de commande (fonctionnait toujours avec SETLOCAL DISABLEEXTENSIONS).

opello
la source
OK, substitution dans les variables. Maintenant - comment remplacer un deux-points ( :)?
Tomasz Gandor
@TomaszGandor Cela fonctionne pour moi: echo %TIME: =:%mais si ce n'est pas le cas, essayez peut-être d'échapper au :avec un ^like echo %TIME: =^:%(qui fonctionne aussi pour moi).
opello le
1
+1 pour la simplicité. Les deux points ne sont pas valides dans les noms de fichiers. set theTime =% Time :: =% les supprime. Pouvez-vous substituer 0 à l'espace, supprimer les deux-points et tronquer à 6 caractères (supprimant ainsi la partie décimale) dans une seule instruction? Ce n'est pas si grave si cela prend deux ou trois lignes. Je suis juste curieux.
riderBill
Pas que je sache. Veuillez faire un suivi si vous en trouvez un!
opello
21

Comme cela a été noté, l'analyse de la date et de l'heure n'est utile que si vous connaissez le format utilisé par l'utilisateur actuel (par exemple, MM / jj / aa ou jj-MM-aaaa pour n'en nommer que deux). Cela pourrait être déterminé, mais au moment où vous ferez tout le stress et l'analyse, vous vous retrouverez toujours avec une situation dans laquelle un format inattendu est utilisé et d'autres ajustements seront nécessaires.

Vous pouvez également utiliser un programme externe qui renverra un slug de date dans votre format préféré, mais qui présente les inconvénients de devoir distribuer le programme utilitaire avec votre script / lot.

Il existe également des astuces par lots utilisant l'horloge CMOS de manière assez brute, mais c'est trop proche des fils nus pour la plupart des gens, et ce n'est pas toujours l'endroit préféré pour récupérer la date / l'heure.

Voici une solution qui évite les problèmes ci-dessus. Oui, cela présente d'autres problèmes, mais pour mes besoins, j'ai trouvé que c'était la solution la plus simple, la plus claire et la plus portable pour créer un horodatage dans des fichiers .bat pour les systèmes Windows modernes. Ceci n'est qu'un exemple, mais je pense que vous verrez comment modifier d'autres formats de date et / ou d'heure, etc.

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
jph
la source
3
Exactement ce que je cherchais. Quelque chose qui fonctionne sur tous les paramètres régionaux. Merci!
Lost_DM
+1 pour les «systèmes Windows modernes» auxquels nous devons faire face :) Blague à part, c'est une manière très ingénieuse et, comme vous l'avez dit, portable, de traiter le problème.
Zach Young
9
C'est une solution terrible. En cas d'échec, un paramètre global est définitivement modifié. Il introduit également des conditions de compétition avec d'autres applications.
MikeKulls
Vous pouvez utiliser la reg query "HKCU\Control Panel\International" /v sShortDatepièce sans modifier le paramètre de registre (exercice laissé au lecteur!).
tricasse
9

Ce qui suit n'est peut-être pas une réponse directe, mais une réponse proche?

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%

Au moins, cela peut être inspirant.

ufukgun
la source
9

Si vous n'avez pas exactement besoin de ce format:

2009_07_28__08_36_01

Ensuite, vous pouvez utiliser les 3 lignes de code suivantes qui utilisent% date% et% time%:

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

Remarque: les caractères /et :sont supprimés et le caractère .et l'espace sont remplacés par un trait de soulignement.

Exemple de sortie (prise le mercredi 8/5/15 à 12 h 49 avec 50 secondes et 93 millisecondes):

echo %mytimestamp%
Wed_08052015_124950_93
Jesse
la source
lorsque l'heure est inférieure à 12, définir ma date =% date: / =% définir mon heure =% heure :: =% définir mon heure =% mon heure: = 0% définir mon horodatage =% ma date: = _% _% mon heure:. = _ %
ragche
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%
Mike Raynham
la source
6

Le offset:lengthformatage pris en charge avec la SETcommande sous Windows ne vous permettra pas de remplir le fichier 0comme vous semblez intéressé.

Cependant, vous pouvez coder un script BATCH pour vérifier que l'heure est inférieure à 10et
ajouter en conséquence une echochaîne différente .

Vous trouverez quelques informations sur la SETcommande sur ce lien .


Vous pouvez également passer à d'autres méthodes de programmation pour y arriver.

Il est assez simple sous unix bash (disponible avec Cygwin sous Windows) de dire simplement,

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

Et, il se tamponne toujours correctement.

nik
la source
6

Je l'ai fait de cette façon:

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

La glace
la source
Il fonctionne sur un serveur anglais (nom du système d'exploitation: Microsoft (R) Windows (R) Server 2003 Standard x64 Edition, version du système d'exploitation: 5.2.3790 Service Pack 2 Build 3790)
Ice
1
et également testé sur un serveur allemand (Betriebssystemname: Microsoft® Windows Server® 2008 Enterprise, Betriebssystemversion: 6.0.6002 Service Pack 2 Build 6002)
Ice
1
Même celui-ci est ok: (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%  

La première ligne sort toujours dans ce format en ce qui
concerne le fuseau horaire: 20150515150941.077000 + 120
Cela vous laisse simplement formater la sortie en fonction de vos souhaits.

Kees
la source
4

Ce fichier bat (enregistrer sous datetimestr.bat) produit la chaîne datetime 3 fois: (1) longue chaîne datetime avec jour de la semaine et secondes, (2) courte chaîne datetime sans eux et (3) version courte du code.

@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

Pour donner un crédit approprié, j'ai fusionné les concepts de Peter Mortensen (18 juin 14 à 21 h 02) et opello (25 août 11 à 14 h 27).

Vous pouvez écrire cela beaucoup plus court, mais cette version longue facilite la lecture et la compréhension du code.

cadvena
la source
4

Je suis vraiment nouveau dans les fichiers batch et c'est mon code !! (Je ne sais pas pourquoi, mais je ne pouvais pas combiner date / t et heure / t ensemble et je ne pouvais pas utiliser % date% et % time% directement sans variable ...)

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

Il est en quelque sorte réutilisé par d'autres (la question était d'obtenir un timedate formaté à utiliser comme nom de fichier).

Kelly
la source
4

Il existe un autre moyen simple de le faire:

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

Pour générer un YYYY-MM-DD hh:mm:sshorodatage (24 heures), j'utilise:

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%)
M. Dudley
la source
Assume-t-il un cadre régional particulier?
Peter Mortensen
1
Selon ss64.com/nt/syntax-variables.html, les variables %TIME%et %DATE%utilisent respectivement le même format que les commandes TIMEet DATE. Sur mon système, les variables ne correspondent pas à mes paramètres régionaux.
M. Dudley
3

Ce script batch fera exactement ce que l'OP veut (testé sur Windows XP SP3).

J'ai également utilisé cette astuce de registre intelligente décrite par "jph" précédemment, qui à mon humble avis est le moyen le plus simple d'obtenir un formatage cohérent à 100% de la date à "yyyy_MM_dd" sur n'importe quel système Windows, nouveau ou ancien. Le changement d'une valeur de Registre pour ce faire est instantané temporaire et insignifiant; il ne dure que quelques millisecondes avant d'être immédiatement rétabli.

Double-cliquez sur ce fichier de commandes pour une démonstration instantanée, la fenêtre d'invite de commandes apparaîtra et affichera votre horodatage. . . . .

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: 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
derty2
la source
Fonctionne également sur Windows 2019. Je vais garder votre solution, je l'aime :)
user225479
Question, je viens de découvrir qu'après minuit, le "0" final est supprimé dans la sortie. Une idée de pourquoi? Ma sortie avec votre script donne: Votre horodatage est: 2019_09_16__0_58_07 au lieu de ..00_58_07. Mais après 1 heure, cela fonctionne comme prévu (et il donnera la sortie: ..01_01_56).
user225479
J'ai ajouté IF% HOUR% == 0 (SET HOUR = 00) à l'instruction ELSE. Cela devrait résoudre le problème, j'espère :)
user225479
Merci pour les commentaires @ user225479. J'ai corrigé le code. Toutes les permutations possibles de la variable HOUR convertie au format 24 HOUR fonctionneront désormais correctement. J'ai également modifié la mise en page pour qu'elle soit plus facile à lire.
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%
Will Wu
la source
2

Créez un fichier appelé "search_files.bat" et placez le contenu ci-dessous dans le fichier. Puis double-cliquez dessus. La variable temporaire% THH% a été mise en place pour gérer le MA de manière appropriée. S'il y a un 0 dans les 2 premiers chiffres de l'heure, Windows ignore le reste du nom de fichier du fichier 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
MacGyver
la source
2

J'aime la version courte au-dessus de @The lorax, mais pour d'autres paramètres de langue, cela peut être légèrement différent.

Par exemple, dans les paramètres de langue allemande (avec le format de date naturel: jj.mm.aaaa), la requête du mois doit être modifiée de 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
webMac
la source
1

C'est mes 2 cents pour un datetime string. Sur les MM DD YYYYsystèmes, permutez les première et deuxième %DATE:~entrées.

    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%
Cas
la source
1

J'ai essayé la réponse acceptée et cela fonctionne plutôt bien. Malheureusement, le format de l'heure américain semble être H: MM: SS.CS, et le 0 manquant à l'avant causait des problèmes d'analyse avant 10 heures. Pour surmonter cet obstacle et permettre également l'analyse de la plupart des formats d'heure mondiale, j'ai mis au point cette routine simple qui semble fonctionner assez bien.

: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

La bonne chose avec cette routine est que vous passez la chaîne de temps comme premier paramètre et le nom de la variable d'environnement que vous voulez contenir l'heure (en centisecondes) comme deuxième paramètre. Par exemple:

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

(* Chris *)

TheChrisPratt
la source
1

Peut-être quelque chose comme ça:

@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
SerGeeK Kasimov
la source
1

Dans des situations comme celle-ci, utilisez une approche de programmation simple et standard: au lieu de dépenser un énorme effort pour analyser une entité inconnue, enregistrez simplement la configuration actuelle, réinitialisez-la à un état connu, extrayez les informations, puis restaurez l'état d'origine. Utilisez uniquement des ressources Windows standard.

Plus précisément, les formats de date et d'heure sont stockés sous la clé de registre HKCU \ Control Panel \ International \ dans [MS definition] "values": "sTimeFormat" et "sShortDate". Reg est l'éditeur de registre de console inclus avec toutes les versions de Windows. Des privilèges élevés ne sont pas requis pour modifier la clé 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

Simple, direct et devrait fonctionner pour toutes les régions.

Pour des raisons que je ne comprends pas, la réinitialisation de la valeur "sShortDate" prend effet immédiatement dans une fenêtre de console, mais la réinitialisation de la valeur "sTimeFormat" très similaire ne prend PAS effet jusqu'à ce qu'une nouvelle fenêtre de console soit ouverte. Cependant, la seule chose modifiable est le délimiteur - les positions des chiffres sont fixes. De même, le jeton de temps "HH" est censé ajouter des zéros non significatifs, mais ce n'est pas le cas. Heureusement, les solutions de contournement sont faciles.

ArtK
la source
-1 "Au lieu d'ajouter un zéro non significatif, pourquoi ne pas perturber la configuration de la machine, la changer selon votre besoin aléatoire et ensuite faire votre truc?" Cette approche est hors de ce monde, nécessite un effort considérable et peut conduire à un nombre infini de conséquences indésirables. Et je ne veux même pas commencer la discussion sur la lisibilité et le comportement standard attendu du code. gloire.
vaitrafra
La réinitialisation du sTimeFormatformat de l' heure est inutile . Nan. Comme il affecte l'invite de la console suivante, appliquez-le en utilisantfor /f "delims=" %%G in ('cmd /C echo SET "DateTime=%%date%%__%%time%%"') do %%G
JosefZ
1

Ce script utilise une interface WMI accessible principale via l'outil WMIC, qui fait partie intégrante de Windows depuis Windows XP Professionnel (l'édition familiale est également prise en charge, mais l'outil n'est pas installé par défaut). Le script implémente également une solution de contournement de l'outil WMIC manquant en créant et en appelant un vbscript WSH pour accéder à une interface WMI et écrire dans la sortie de la console l'heure avec le même format que celui fourni par l'outil 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
Petr Matlas
la source
1

Une belle astuce sur une seule ligne pour éviter l'expansion précoce des variables consiste à utiliser cmd /c echo ^%time^%

cmd /c echo ^%time^% & dir /s somelongcommand & cmd /c echo ^%time^%
tresf
la source
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
:: =============================================================
Christo
la source
0

Pour une solution très simple pour la date numérique à utiliser dans les noms de fichiers, utilisez le code suivant:

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
Thomas Boomer
la source
0

Divisez les résultats de la commande de date par une barre oblique, puis vous pouvez déplacer chacun des jetons dans les variables appropriées.

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%
Casey
la source