The SystemTime you used is an object type, nothing more. That means all that your code did was create a NEW object, with a type of SystemTime, and then tried to print it’s values. Your assumption that “it should be set to the current time” is wrong. It’s an object, you use it how you want.
How do they relate? They have different contexts and are all different, but are all ways to interact with times. There’s at least two independent timesources in a microprocessor, the system time and the RTC if it has one. The system time runs off the system crystal/oscillator which is typically not overly accurate, and the RTC is independent and has a 32,768hz crystal that makes it easy to keep accurate time (using overflow of a 15-bit register)
Here’s what you should do.
On boot, see if your RTC has a valid time.
If yes, set the system time from that.
From then on, use DateTime.now() which always will be the system time.
If you are really concerned about accuracy, periodically (using a timer, say every hour) compare system time and RTC and adjust it if necessary.