I have 3 RTC boards, 1 from Adafruit and 2 from China (bought on ebay). The Adafruit board uses a PCF8523 chip. The Chinese boards use a DS1307. The RTC library supports both chips.
I have had all of these boards for about 4 years. They all show the same characteristic of poor accuracy. All of them gain time at the rate of about 8 seconds per day. Over a few months, this amounts to quite a big discrepancy. I did not realize this at first. After about 3 months I realized that the time was way off and I needed to do something about it.
The literature I read suggested that temperature affects the accuracy. My boards are all used in my basement, which has a relatively stable year round temperature of about 65 deg F, with a variation of about +/- 5 degrees F. I had to do a few things to correct the time.
#1 I wrote a program that sets the RTC clock to the compile timestamp of the Arduino program. The compile time is in the Arduino DATE variable. The program also stores the date and time that the clock was set in the Arduino EEPROM memory. This program also can be used to read the RTC clock and report the drift, and the daily adjustment needed to obtain the proper time. This assumes that the drift is linear over time. I am pretty sure that the drift is not linear, but I think the error is slight.
#2 I wrote my own “get time” function that is used by any program that uses an RTC. The function reads the RTC value, reads the “last time set” from EEPROM, and then applies the drift correction.
I preferred to store the “last time set” in the RTC chip. This could be done with the DS1307 chip (which contains a small amount of non-volitile memory), but not the PFC8523 (which has no non-volitile memory). I wanted a common method, so I opted to keep each RTC board with a specific Arduino board and store the time of the last setting in the Arduino memory.