WSL2 Ubuntu 时间使用错误的 TZ 来计算位置时间?

WSL2 Ubuntu 时间使用错误的 TZ 来计算位置时间?

我有一台在 Windows 10 中运行的 Ubuntu 18.04 WSL2 机器,有时我会遇到这个奇怪的问题,即 WSL2 机器中的时间不同步。我的时区是东部时间 (-5),如下所示,我的 WSL 是未来 5 小时。感觉出于某种原因,我的 WSL 机器将我的本地时间解释为 UTC,并根据该信息进行计算。

WSL2

$ date 
Fri Jan 22 03:13:28 EST 2021
$ cat /etc/timezone
America/Toronto
$ date +"%Z %z"
EST -0500

电源外壳

> date
Thursday, January 21, 2021 10:13:31 PM
> Get-TimeZone


Id                         : Eastern Standard Time
DisplayName                : (UTC-05:00) Est (É.-U. et Canada)
StandardName               : Est
DaylightName               : Est (heure d’été)
BaseUtcOffset              : -05:00:00
SupportsDaylightSavingTime : True

我尝试做了sudo dpkg-reconfigure tzdata但没有帮助。

编辑:添加屏幕截图,时间与我之前提到的时间不匹配,但屏幕截图显示了正确的当地时间和时区。

在此处输入图片描述

答案1

我有一台在 Windows 10 中运行的 Ubuntu 18.04 WSL2 机器,有时我会遇到这个奇怪的问题,即 WSL2 机器中的时间不同步。我的时区是东部时间 (-5),如下所示,我的 WSL 是未来 5 小时。感觉出于某种原因,我的 WSL 机器将我的本地时间解释为 UTC,并根据该信息进行计算。

这是 WSL2 的一个已知问题:系统日期与 Windows (WSL 2) 不一致 #4245

您必须在 WSL2 实例中运行以下命令:

sudo hwclock -s

您可以运行以下 PowerShell 命令:

wsl -u root sh -C "hwclock -S"

您还必须执行以下 PowerShell 命令:

wsl --shutdown

运行该命令后,您必须重新启动 WSL 实例。

该解决方案还需要使用 Chrony,并在其中注释掉以下选项/etc/chrony/chrony.conf

# Stop bad estimates upsetting machine clock.
# maxupdateskew 100.0

如果您尚未使用它:

sudo apt-get update && sudo apt-get install -y chrony && sudo chronyd

另一种解决方案是将以下内容添加到 .bashrc:

# WSL2 clock skew hack
__customprompt() {
  NOW=$(date +%s)
  if (( NOW > WSL_NEXT_CLOCKSYNC )); then
    echo "$(date -Iseconds) - hwclock [$WSL_NEXT_CLOCKSYNC : $NOW]" >> ~/.wsltimesync
    nohup wsl.exe -u root -c 'hwclock -s' &>/dev/null &
    export WSL_NEXT_CLOCKSYNC=$(date --date='+5 minutes' +%s)
  fi
}

来源:

另一种替代解决方案是根据记录的特定事件的检测在 Windows 内自动处理它。

这可以通过以下 PowerShell 脚本来处理:

function Log($message) {
    $output = (Get-Date).ToUniversalTime().ToString("u") + "`t$message"
    Add-Content -Path "~/.wsl-clock.log" -Value $output
}

Log "********************************"
Log "*** Update WSL clock starting..."

$runningDistroCount = wsl --list --running --quiet |
        Where-Object {$_ -ne ""} |
        Measure-Object |
        Select-Object -ExpandProperty Count

if ($runningDistroCount -eq 0){
    Log "No Distros - quitting"
    exit 0
}

$originalDate=wsl sh -c "date -Iseconds"

Log "Performing reset..."
$result = wsl -u root sh -c "hwclock -s" 2>&1
$success = $?
if (-not $success){
    Log "reset failed:"
    Log $result
    exit 2
} else {
    $newDate=wsl bash -c "date -Iseconds"
    Log "clock reset"
    Log "OriginalDate:$originalDate"
    Log "NewDate:     $newDate"
    exit 0
}

来源:使用 WSL 2 修复时钟偏差

您还可以使用wsl-时钟

其他资源:

答案2

我刚刚发出了以下命令:

sudo hwclock -s

对我来说很管用。此命令修复了所描述的问题这里

我使用的环境是:

  • 操作系统:Windows 10
  • 运行 Ubuntu 22.04.2 LTS 的 WSL

相关内容