लोकेल-अनजान% DATE% और% TIME% बैच फ़ाइलों में?


16

%DATE%और %TIME%वातावरण चर कमांड लाइन पर और एक बैच फ़ाइल के अंदर आज की तारीख और Windows मशीनों पर समय प्रदान करते हैं।

अफसोस की बात है, वे मूल्य स्थानीय-जागरूक हैं! मतलब यह है कि, जर्मन मशीन पर, आप कहेंगे

26.1.2011

के बजाय

2011-26-01

यदि आप इस चर का उपयोग फ़ाइल नाम में करना चाहते हैं तो यह स्क्रू अप कर रहा है।

क्या YYYY-MM-DDविंडोज बैच फ़ाइल में लोकेल-अनजान डेट स्ट्रिंग की पकड़ का कोई आसान तरीका है ?

फिलहाल, मैं इसके बजाय काम करने के तरीके के साथ काम कर रहा हूं:

for /f "tokens=1,2,3,4 delims=. " %%i in ('date /t') do set date=%%k-%%j-%%i
echo %date%

लेकिन यह अब जर्मन लोकेल विशिष्ट है - जाहिर है, एक पूरी तरह से स्वतंत्र समाधान बहुत अच्छा होगा।

प्रश्न में OS सर्वर 2008 है। मैं बहुत संभव है कि किसी तीसरे पक्ष के उपकरण का उपयोग न करना पसंद करूं।

जवाबों:


22

कुछ प्रयास थे ( रोब वैन डेर वूडे के पास कुछ था), लेकिन सभी स्थानों पर वास्तव में कुछ भी काम नहीं हुआ। हालाँकि, आप वर्तमान समय को आसानी से पार्स करने योग्य प्रारूप में प्राप्त कर सकते हैं

wmic os get LocalDateTime

निम्नलिखित आपको कम से कम यूटीसी पहले से ही मिलता है:

@echo off
rem Get the time from WMI - at least that's a format we can work with
set X=
for /f "skip=1 delims=" %%x in ('wmic os get localdatetime') do if not defined X set X=%%x
echo.%X%

rem dissect into parts
set DATE.YEAR=%X:~0,4%
set DATE.MONTH=%X:~4,2%
set DATE.DAY=%X:~6,2%
set DATE.HOUR=%X:~8,2%
set DATE.MINUTE=%X:~10,2%
set DATE.SECOND=%X:~12,2%
set DATE.FRACTIONS=%X:~15,6%
set DATE.OFFSET=%X:~21,4%

echo %DATE.YEAR%-%DATE.MONTH%-%DATE.DAY% %DATE.HOUR%:%DATE.MINUTE%:%DATE.SECOND%.%DATE.FRACTIONS%

हालाँकि, आपको संभवतः समय क्षेत्र ऑफसेट के लिए खाते की आवश्यकता है (जब तक कि यह एक लॉग फ़ाइल के लिए नहीं है, तब मैं हमेशा यूटीसी का उपयोग करूंगा) लेकिन यह कुछ भी नहीं है गणना नहीं कर सकता :-)


1
बहुत बढ़िया, यह बिल्कुल वैसा ही दिखता है जैसा मुझे चाहिए! धन्यवाद।
पेका

2
रिकॉर्ड के लिए: for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%xएक छोटा सा अच्छा है। यहाँ पर एक और अधिक कॉम्पैक्ट संस्करण भी उपलब्ध है , अर्थात् उस टिप्पणी में
तोमलक

यह उन सभी पुराने उदाहरणों को खोजने और अद्यतन करने में थोड़ा कठिन है जहां आपने कुछ लिखा है :)। मैं शायद अब तक Win32_UTCTime और Win32_LocalTime का उपयोग करूंगा।
जॉय

वाकई बहुत बढ़िया!
15

जैसा कि @Tomalak कहते हैं, findstrसमाधान बहुत बेहतर है, जैसा कि मेरे मामले में, मूल for(बिना skip) 3 बार पुनरावृत्त करता है। शब्द के लिए "LocalDateTime"एक बार, वास्तविक तिथि के लिए दूसरी बार और रिक्त मान के लिए तीसरी बार (शायद एक लाइन ब्रेक?)।
कैवलप्लो नोव

9

यहाँ मैं एक दो-लाइनर का उपयोग कर रहा हूँ, जो विंडोज संस्करण या स्थानीय समय सेटिंग्स की परवाह किए बिना काम करता है:

FOR /f %%a in ('WMIC OS GET LocalDateTime ^| find "."') DO set DTS=%%a
set CUR_DATE=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%

यह निम्नलिखित ISO मानक प्रारूप में% CUR_DATE% नामक एक चर सेट करेगा:

yyyy-mm-dd

मैंने इसे && के साथ एक-लाइनर बनाने की कोशिश की, लेकिन यह प्रतीत नहीं हुआ, इसलिए मैंने दो-पंक्ति संस्करण का सहारा लिया। उम्मीद है की यह मदद करेगा।


0

मैं UTC पाने के लिए इस ट्रिक का उपयोग करता हूँ।

for /f "tokens=*" %%i in ('tzutil /g') do set CTZ=%%i
tzutil /s UTC
set UTC=
for /f  "skip=1 delims=" %%i in ('WMIC OS GET LocalDateTime') do if not defined UTC set UTC=%%i
tzutil /s "%CTZ%"
set UTC=%UTC:~0,4%-%UTC:~4,2%-%UTC:~6,3%T%UTC:~8,13%
echo %UTC%

हालाँकि इसका पूरा सिस्टम UTC में संक्षेप में बदलने का दुष्प्रभाव है। यह शायद एक व्यक्तिगत कार्य केंद्र पर ठीक है, लेकिन यह सुनिश्चित नहीं है कि एक बड़े उत्पादन सर्वर पर क्या प्रभाव पड़ेगा, जो कि वैसे भी यूटीसी के लिए निर्धारित किया जाना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.