Sincronizar data e hora do WSL2

Sincronize data e hora no WSL2 com um script simples, evitando problemas de divergência temporal e facilitando o desenvolvimento.

Utilizo o WSL2 (Windows Subsystem for Linux version 2) há anos para desenvolver em JavaScript/TypeScript e Go, proporcionando uma configuração padronizada para toda a equipe. No entanto, recentemente, encontrei um problema de sincronização de data e hora durante o debug de uma API. Ao executar o comando date, a data e hora exibidas estavam diferentes das do Windows.

Após pesquisa, identifiquei que o problema era a versão do WSL2. Uma solução seria atualizar o WSL2, mas isso demandaria reconfiguração completa. Em vez disso, desenvolvi um script para sincronizar automaticamente a data e hora, caso haja divergências.

Criando o script de sincronização

Navegue até a pasta HOME do seu usuário no Ubuntu:

cd ~

Crie um arquivo chamado sync_time.sh:

touch sync_time.sh

Edite o arquivo com o seu editor favorito (no caso utilizarei o VS Code):

code sync_time.sh

Insira o seguinte código no arquivo:

#!/usr/bin/env bash

YELLOW='\033[0;33m'
NC='\033[0m'
RED='\033[0;31m'

TIME_SERVER=ntp.ubuntu.com

# Function to get the offset in seconds from the time server
get_offset_from_server() {
    ntpdate -q $TIME_SERVER | grep -oP '(?<=offset )[-+]?[0-9]*\.?[0-9]+'
}

# Function to get the current system date and time
get_current_date() {
    date "+%Y-%m-%d %H:%M:%S"
}

# Function to convert date and time to epoch seconds
to_epoch() {
    date -d "$1" +%s
}

# Sync WSL time
sync_date() {
    echo -e "${RED}sudo ntpdate $TIME_SERVER ${NC}"
    echo
    sudo ntpdate $TIME_SERVER
}

# Main script
echo -e "${YELLOW}Checking system time..."

current_date=$(get_current_date)
offset=$(get_offset_from_server | head -1) # Use only the first offset value

if [[ -z "$offset" ]]; then
    echo -e "${RED}Failed to get time offset from server.${NC}"
    exit 1
fi

# Calculate the server date by adjusting the current date with the offset
server_date=$(date -d "$current_date $offset sec" "+%Y-%m-%d %H:%M:%S")

current_epoch=$(to_epoch "$current_date")
server_epoch=$(to_epoch "$server_date")

echo -e "${YELLOW}Current system date and time: ${NC}$current_date"
echo -e "${YELLOW}Date and time from time server: ${NC}$server_date"

time_diff=$((server_epoch - current_epoch))
time_diff=${time_diff#-} # Get absolute value of time difference

if [ "$time_diff" -gt 60 ]; then
    read -p "There is a difference in the date and time of more than a minute. Do you want to synchronize? (Y/N) [Y]: " choice
    choice=${choice:-Y} # Default to 'Y' if no input
    case "$choice" in 
        Y|y ) sync_date;;
        N|n ) echo -e "${YELLOW}Date and time synchronization skipped.${NC}";;
        * ) echo -e "${RED}Invalid choice.${NC}";;
    esac
else
    echo -e "${YELLOW}The date and time are synchronized within a minute.${NC}"
fi

Salve o arquivo e habilite sua execução:

chmod +x sync_time.sh

Adicione o script ao arquivo de perfil do shell (.zshrc):

code .zshrc

No final do arquivo, adicione:

bash $HOME/sync_time.sh

Salve o arquivo.

Executando o script

Com o script adicionado ao perfil do shell, ele será executado sempre que um novo terminal for aberto. Se houver divergência de datas, você será solicitado a sincronizá-las. O output será semelhante a:

Checking system time...
Current system date and time: 2024-07-17 18:34:09
Date and time from time server: 2024-07-17 18:34:09
The date and time are synchronized within a minute.

Essa solução evita problemas causados por data e hora incorretas, mas recomenda-se atualizar o WSL2 para evitar a necessidade deste workaround.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *