The Linux software clock is not always accurate. It is kept running by a periodic timer interrupt generated by PC hardware. If the system has too many processes running, it may take too long to service the timer interrupt, and the software clock starts slipping behind. The hardware clock runs independently and is usually more accurate. If you boot your computer often (as is the case for most systems that aren't servers), it will usually keep fairly accurate time.
If you need to adjust the hardware clock, it is usually simplest to reboot, go into the BIOS setup screen, and do it from there. This avoids all trouble that changing system time might cause. If doing it via BIOS is not an option, set the new time with date and clock (in that order), but be prepared to reboot, if some part of the system starts acting funny.
A networked computer (even if just over the modem) can check its own clock automatically, by comparing it to some other computer's time. If the other computer is known to keep very accurate time, then both computers will keep accurate time. This can be done by using the rdate and netdate commands. Both check the time of a remote computer (netdate can handle several remote computers), and set the local computer's time to that. By running one these commands regularly, your computer will keep as accurate time as the remote computer.
XXX say something intelligent about NTP