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.