Bản địa-không biết% DATE% và% TIME% trong các tệp bó?


16

Các biến %DATE%%TIME%môi trường cung cấp ngày và giờ hiện tại trên các máy Windows trên dòng lệnh và bên trong một tệp bó.

Đáng buồn thay, những giá trị đó là nhận thức địa phương! Có nghĩa là, trên máy Đức, bạn sẽ nhận được

26.1.2011

thay vì

2011-26-01

vít này sắp xếp nếu bạn muốn sử dụng biến này trong tên tệp.

Có cách nào dễ dàng để giữ YYYY-MM-DDchuỗi ngày cục bộ không biết trong tệp bó Windows không?

Hiện tại, tôi đang làm việc với cách giải quyết khá đơn giản này:

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

nhưng đây là địa phương cụ thể của Đức - rõ ràng, một giải pháp hoàn toàn độc lập sẽ đẹp hơn nhiều .

Hệ điều hành được đề cập là Server 2008. Tôi rất muốn không sử dụng công cụ của bên thứ ba, nếu có thể.

Câu trả lời:


22

Có một vài nỗ lực ( Rob van der Woude có một cái gì đó), nhưng không có gì thực sự hoạt động trên tất cả các địa phương. Tuy nhiên, bạn có thể có được thời gian hiện tại ở định dạng dễ phân tích thông qua

wmic os get LocalDateTime

Những điều sau đây giúp bạn có ít nhất UTC rồi:

@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%

Tuy nhiên, có lẽ bạn cần tính đến phần bù múi giờ (trừ khi đó là tệp nhật ký, sau đó tôi luôn sử dụng UTC) nhưng đó không phải là một chút tính toán nào có thể làm được :-)


1
Tuyệt vời, nó trông giống hệt những gì tôi cần! Cảm ơn bạn.
Pekka

2
Đối với bản ghi: for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%xlà một chút nhỏ đẹp hơn. Ngoài ra còn có một phiên bản nhỏ gọn hơn có sẵn ở đây , cụ thể là trong nhận xét đó .
Tomalak

Thật khó để tìm và cập nhật tất cả các trường hợp cũ nơi bạn đã viết một cái gì đó :). Bây giờ tôi có thể sử dụng Win32_UTCTime và Win32_LocalTime.
Joey

thực sự tuyệt vời
jeromerg

Như @Tomalak nói, findstrgiải pháp tốt hơn nhiều, như trường hợp của tôi, bản gốc for(không có skip) lặp lại 3 lần. Một lần cho từ này "LocalDateTime", lần thứ hai cho ngày thực tế và lần thứ ba cho một giá trị trống (có thể là ngắt dòng?).
cavpollo

9

Đây là một hai lớp tôi đã sử dụng, dường như hoạt động bất kể phiên bản Windows hoặc cài đặt giờ địa phương:

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%

Điều này sẽ đặt một biến có tên% CUR_DATE% theo định dạng chuẩn ISO sau:

yyyy-mm-dd

Tôi đã thử biến nó thành một lớp lót với &&, nhưng dường như không có, vì vậy tôi đã dùng đến phiên bản hai dòng. Hi vọng điêu nay co ich.


0

Tôi sử dụng thủ thuật này để có được 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%

Tuy nhiên, nó có tác dụng phụ là thay đổi nhanh chóng toàn bộ hệ thống thành UTC. Điều này có thể ổn trên máy trạm cá nhân, nhưng không chắc tác động của máy chủ sản xuất lớn, có lẽ nên được đặt thành UTC.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.