My system also acts similar to yours. But, this is normal. I am assuming that your hardware clock is set to UTC. For this, check the last line of the timedatectl
command output:
RTC in local TZ: no
means that your hardware clock is set to UTC.
Checking the man
page for hwclock
:
-l, --localtime; -u, --utc
Indicate which timescale the Hardware Clock is set to.
The Hardware Clock may be configured to use either the UTC or the local timescale, but nothing in the clock itself says which alternative is being used. The --localtime or --utc options give this information to the hwclock command. If you specify the wrong one (or specify neither and take a wrong default), both setting and reading the Hardware Clock will be incorrect.
If you specify neither --utc nor --localtime then the one last given with a set function (--set, --systohc, or --adjust), as recorded in /etc/adjtime, will be used. If the adjtime file doesn’t exist, the default is UTC.
Note: daylight saving time changes may be inconsistent when the Hardware Clock is kept in local time. See the discussion below, under LOCAL vs UTC.
My understanding is this:
Assume current time 17:03 UTC. Your local time for your current time zone is 14:03 (UTC-03). Note that, only the operating system has the notion of time zones; the hardware clock knows nothing about time zones.
Now assume that your hardware clock (aka the Real Time Clock or RTC) is set to UTC (and not to your local time), in other words, is it set to 17:03. BTW, setting the hardware clock to UTC is the recommended method if you are not dual booting with Windows.
The command hwclock --localtime
says "bring me the hw clock's current local time assuming that the hw clock is set in localtime". The command will assume that the value returned by the hardware (17:03) is in local time already and it will just print 17:03.
The command hwclock --utc
says "bring me the hw clock's current local time assuming that the hw clock is set in utc". The command will assume that the value returned by the hardware (17:03) is in UTC and it will convert to your local time, and print 14:03.
To reiterate:
--utc
means assume the hardware clock is set to UTC.
--localtime
means assume the clock is set to local time.
In all cases, hwclock
prints the time received from the hardware by converting it to local time. Since, UTC is +3 from you, to print the local time it must subtract 3 hours when you tell it (with --utc
) that the clock is set to UTC. But, it shows the time of the clock unmodified when you tell it (with --localtime
) that RTC is already set to local time.
You can also run the hwclock
commands with the --test
or --verbose
option to see more details.