4

バッチ スクリプトを書いていますが、UNIX 時間が必要です。Linuxでは簡単ですが、Windowsでこれを行う方法がわかりません。

4

3 に答える 3

12

これは、どのロケールでも機能するネイティブ バッチ ソリューションです。WMIC を使用して、ロケールに依存しない方法で現在の現地時間を取得します。他のすべては、文字列の解析と基本的な計算の「単純な」問題です。

:UnixTime  [ReturnVar]  [TimeStamp]
::
:: Computes the Unix time from the current local time as reported by the
:: operating system. The Unix time is the number of seconds that have elapsed
:: since midnight Coordinated Universal Time (UTC), January 1, 1970, not
:: counting leap seconds.
::
:: The result is returned in variable ReturnVar,
:: or the result is echoed if ReturnVar is not specified
::
:: If the TimeStamp is provided in the 2nd parameter, then the Unix time for
:: the TimeStamp is computed, rather then for the current time.
::
:: The TimeStamp must have the same format as used by WMIC:
::
::   YYYYMMDDhhmmss.ffffffSzzz
::
:: where:
::
::   YYYY   = gregorian year
::   MM     = month
::   DD     = day
::   hh     = hour in 24 hour format
::   mm     = minute
::   ss     = seconds
::   ffffff = fractional seconds (microseconds)
::   S      = timezone sign: + or -
::   zzz    = timezone: minutes difference from GMT
::
:: Each component must be zero prefixed as needed to maintain the proper width.
::
:: The ReturnVar parameter must be provided in order to use the TimeStamp.
:: A ReturnVar of "" will function the same as no ReturnVar. This enables the
:: specification of a TimeStamp without an actual ReturnVar.
::
@echo off
setlocal
set "ts=%~2"
if not defined ts for /f "skip=1 delims=" %%A in ('wmic os get localdatetime') do if not defined ts set "ts=%%A"
set /a "yy=10000%ts:~0,4% %% 10000, mm=100%ts:~4,2% %% 100, dd=100%ts:~6,2% %% 100"
set /a "dd=dd-2472663+1461*(yy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yy+4900+(mm-14)/12)/100)/4"
set /a ss=(((1%ts:~8,2%*60)+1%ts:~10,2%)*60)+1%ts:~12,2%-366100-%ts:~21,1%((1%ts:~22,3%*60)-60000)
set /a ss+=dd*86400
endlocal & if "%~1" neq "" (set %~1=%ss%) else echo %ss%
exit /b


このソリューションの寿命は限られていることに注意してください。Unix 時間が符号付き 32 ビット整数の最大値を超えると、2038 年 1 月 19 日に動作しなくなります。

編集- 現在の現地時間ではなく、コマンド ラインでタイムスタンプ文字列の変換をサポートするようにコードが編集されました。サポートされる時間の正確な範囲は、1901-12-13 20:45:52.000000 から 2038-01-19 03:14:07.999999 GMT です。1970-01-01 00:00:00.000000 より前の時間は負の値になります。

于 2012-06-20T21:48:14.103 に答える
3

Windowsでvbscriptを使用できます。インタープリターはシステムで利用できます。

'--------------------epoch.vbs----------------------- 
option explicit
dim s,o,z
for each o in GetObject("winmgmts:").InstancesOf ("Win32_OperatingSystem")
z=o.CurrentTimeZone
next
s=DateDiff("s", "01/01/1970 00:00:00", Now())-(60*z)
wscript.echo(s)
wscript.quit
于 2012-06-20T17:54:59.997 に答える
3

「UNIX 時間」がエポック秒を意味する場合、Windows にはそれを生成するためのツールが含まれていません。代わりに、サードパーティのツールをインストールできます。例えば:

  • Cygwinをインストールします。
  • dateバイナリを見つけC:\Cygwin\ます(インストールした場所の下または場所)
  • Linux と同じように使用します。

または、この回答に関するすばらしいコメントに従って、コマンドも含むGNU Coreutilsをインストールできます。date必要のない他の多くのツールが含まれていますが、Cygwin も同様です。

于 2012-06-20T17:16:12.807 に答える