If your BIOS time is "correct" for your local timezone and you aren't in GMT, then it's not right. On a linux system the BIOS time should be set to UTC.
The OS time (which is derived from the BIOS at boot time) is also in UTC internally. The local timezone is also set in the OS, from this, all applications can correctly display the local time.
ntp attempts to connect to several other ntp servers and from this it can calculate the correct time. If the correct time is less than 1,000 seconds from the OS clock, it will attempt to slowly adjust the OS time to the correct time. It does this gradually so that other programs and the operating system don't freak out. If the time is more than 1,000 seconds off, ntp gives up.
When the system reboots, it sets the hardware clock to the current OS time.