Isso ocorre porque seu sistema está configurado para usar o UTC (ou não tem fuso horário definido) e não o JST. O comando date aceitará o JST como um modificador de entrada, mas usará o padrão do sistema para exibi-lo. Se você quiser que seu sistema deseje que seu sistema exiba a hora no formato JST, você deve definir o fuso horário como JST
remova ou renomeie /etc/localtime
e, em seguida, vincule o arquivo relevante em /usr/share/zoneinfo
a /etc/localtime
cd /etc
mv localtime localtime.orig
ln -s /usr/share/zoneinfo/Japan /etc/localtime
Editar
Para responder ao seu comentário - O comando date precisa entender as informações de fuso horário fornecidas como parte do parâmetro date string
de -s
e o que fazer com ele. Se você examinar o código-fonte , verá que todas as abreviações comuns de fuso horário e seus deslocamentos do GMT estão definidas . Esta informação é então usada para definir a hora corretamente. Dependendo da versão do core-utils que você examinar, você encontrará as informações em lib / parse-datetime.c ou lib / getdate.c