Is the timer of an Arduino accurate enough to build a clock or do I need a RTC?

The arduino is as accurate as a typical home clock, because it uses a crystal oscillator.

However, you’re using the millis() function and although there is a risk of an assumption that this provides a count value in milliseconds, this actually isn’t the case according to https://learn.adafruit.com/multi-tasking-the-arduino-part-2/timers  – that website says that millis() provides a count at a rate of 976.5625Hz, i.e. it increments every 1.024msec. So, this explains why the clock is perceived to be running too slowly.

You could compensate for the discrepancy by adding three seconds to the displayed value every 125 seconds. Another (warranty-voiding, and possibly outside the microcontroller specification too) option is to remove the crystal and replace it with a different one (16.384MHz instead of 16MHz).

Personally I would just add 3 every 125 sec, perhaps spaced out. So, add 1 second when the clock would display that 41 seconds have elapsed, add another second after 83 seconds have accumulated, and add one more second at 125 seconds. Easy to do if you keep another variable counting this. With this approach, if you’re displaying the seconds value, some people might notice it, but if you’re not displaying the seconds then it would go unnoticed.

Reference : 
shabaz(2018), Is the timer of an Arduino accurate enough to build a clock or do I need a RTC?[Correct Answer], Available at: https://www.element14.com/community/thread/62500/l/is-the-timer-of-an-arduino-accurate-enough-to-build-a-clock-or-do-i-need-a-rtc [Accessed 23 May, 2021]