Windows服务器当前时间和本地时间差8个小时的解决办法

当使用谷歌云GCP的windows时候,可能服务器的时间和本地时间总是差8个小时,然而更改时区,却提示没有权限,因为登录用户不是administrator,下面是解决办法

================================

2024.6.5更新新的方法,调整时间的同时会禁用掉自动更新时间,这样防止系统会自动更新时间而导致时间又变了。

这样就可以不用设置开机重启了,只需要运行一次即可。

同时代码后面还更新了恢复自动更新时间的代码,这样后续需要调整,也可以再恢复。

下面是更新时间并禁用自动更新时间的代码

@echo off
setlocal

:: 获取当前日期和时间
for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set datetime=%%a
set year=%datetime:~0,4%
set month=%datetime:~4,2%
set day=%datetime:~6,2%
set hours=%datetime:~8,2%
set minutes=%datetime:~10,2%
set seconds=%datetime:~12,2%

:: 计算新的小时数
set /a "newhours=hours + 8"

:: 检查是否跨过午夜
if %newhours% geq 24 (
    set /a "newhours-=24"
    set /a "day+=1"
)

:: 检查月份天数,以确定是否需要进位到下一个月
call :AdjustDate %year% %month% %day%

:: 格式化时间以确保符合time命令的要求
if %newhours% lss 10 set newhours=0%newhours%

:: 设置系统时间和日期,这里假设你的系统使用YYYY-MM-DD格式
cmd /c date %year%-%month%-%day%
cmd /c time %newhours%:%minutes%:%seconds%

:: 禁用自动时间同步
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient" /v Enabled /t REG_DWORD /d 0 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config" /v UpdateInterval /t REG_DWORD /d 0 /f

goto :eof

:AdjustDate
setlocal enableextensions enabledelayedexpansion
set /a "year=%1", "month=%2", "day=%3"
set "monthdays=31"

:: 调整2月的天数
if "%month%"=="02" (
    set /a "leapyear=year %% 4"
    if !leapyear! equ 0 (
        if "%year% %% 100" neq "0" or "%year% %% 400" eq "0" set "monthdays=29" else set "monthdays=28"
    ) else (
        set "monthdays=28"
    )
)

:: 调整小月的天数
if "%month%"=="04" set "monthdays=30"
if "%month%"=="06" set "monthdays=30"
if "%month%"=="09" set "monthdays=30"
if "%month%"=="11" set "monthdays=30"

if %day% gtr %monthdays% (
    set /a "day=1"
    set /a "month+=1"
    if %month% gtr 12 (
        set /a "month=1"
        set /a "year+=1"
    )
)
endlocal & (
    set "year=%year%"
    set "month=%month%"
    set "day=%day%"
)
goto :eof

下面代码是恢复自动更新时间

@echo off
setlocal
chcp 65001

:: 启用NtpClient以自动同步时间
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient" /v Enabled /t REG_DWORD /d 1 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config" /v UpdateInterval /t REG_DWORD /d 3600 /f

:: 启动Windows Time服务
sc start w32time
sc config w32time start= auto

echo 自动时间同步已恢复。
pause

================================

直接在任意位置创建一个bat文件,比如:UpdateTime.bat

将下面的代码放入bat中

@echo off
setlocal

:: 获取当前日期和时间
for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set datetime=%%a
set year=%datetime:~0,4%
set month=%datetime:~4,2%
set day=%datetime:~6,2%
set hours=%datetime:~8,2%
set minutes=%datetime:~10,2%
set seconds=%datetime:~12,2%

:: 计算新的小时数
set /a "newhours=hours + 8"

:: 检查是否跨过午夜
if %newhours% geq 24 (
    set /a "newhours-=24"
    set /a "day+=1"
)

:: 检查月份天数,以确定是否需要进位到下一个月
call :AdjustDate %year% %month% %day%

:: 格式化时间以确保符合time命令的要求
if %newhours% lss 10 set newhours=0%newhours%

:: 设置系统时间和日期,这里假设你的系统使用YYYY-MM-DD格式
cmd /c date %year%-%month%-%day%
cmd /c time %newhours%:%minutes%:%seconds%
goto :eof

:AdjustDate
setlocal enableextensions enabledelayedexpansion
set /a "year=%1", "month=%2", "day=%3"
set "monthdays=31"

:: 调整2月的天数
if "%month%"=="02" (
    set /a "leapyear=year %% 4"
    if !leapyear! equ 0 (
        if "%year% %% 100" neq "0" or "%year% %% 400" eq "0" set "monthdays=29" else set "monthdays=28"
    ) else (
        set "monthdays=28"
    )
)

:: 调整小月的天数
if "%month%"=="04" set "monthdays=30"
if "%month%"=="06" set "monthdays=30"
if "%month%"=="09" set "monthdays=30"
if "%month%"=="11" set "monthdays=30"

if %day% gtr %monthdays% (
    set /a "day=1"
    set /a "month+=1"
    if %month% gtr 12 (
        set /a "month=1"
        set /a "year+=1"
    )
)
endlocal & (
    set "year=%year%"
    set "month=%month%"
    set "day=%day%"
)
goto :eof

重要说明

  • 在使用该脚本之前,请确保了解你的Windows系统的日期和时间格式。你可以通过在命令提示符下运行date /ttime /t来查看当前系统的日期和时间格式。
  • 如果你的系统使用的是其他日期格式,如MM-DD-YYYYDD-MM-YYYY,请在脚本中相应地调整cmd /c date命令行的日期部分。

然后使用管理员权限运行该bat文件,即可将服务器时间直接加8

还可以将该bat文件设置为开机启动,这样无需每次手动运行

但是有个问题,该bat需要管理员权限才能够正常运行,所以一般的开机启动不行。

这里可以使用任务计划程序

这是推荐的方法,因为它允许你指定任务以管理员权限执行,即使你登录的用户不是管理员。

  1. 打开任务计划程序:在开始菜单搜索“任务计划程序”并打开。
  2. 创建新任务
    • 在任务计划程序的右侧,点击“创建基本任务…”来启动向导。
    • 输入任务的名称和描述。
    • 选择“当计算机启动时”作为触发器。
    • 在“操作”步骤中,选择“启动程序”,然后浏览到你的批处理文件。
    • 在设置选项时,确保勾选“使用最高权限运行”。
  3. 保存并退出:完成向导并确保任务已启用。

然后可以尝试重启下服务器,进行测试。

到此为止。

发布者:彬彬笔记,转载请注明出处:https://www.binbinbiji.com/windows/3389.html

(0)
彬彬笔记彬彬笔记
上一篇 2024年5月12日
下一篇 2024年6月7日

相关推荐

发表回复

登录后才能评论
蜀ICP备14017386号-13