Here are the approximate dates for the halvenings of the BTC block reward, as evidenced by the timestamp on those blocks. Note that the timestamp is not a perfect measure of when the block was found, but it is reasonably accurate, with an assumed margin of error of a couple hours (for more info on this see this question). The time stamp is a component of the block's header, and it is reported in unix time.
- Genesis block - 50 BTC - Unix time 1231006505 (Sat, 03 Jan 2009 18:15:05 GMT)
Block 210,000 - 25 BTC - Unix time 1354116278 (Wed, 28 Nov 2012 15:24:38 GMT)
Block 420,000 - 12.5 BTC - Unix time 1468082773 (Sat, 09 Jul 2016 16:46:13 GMT)
Block 630,000 - 6.25 BTC - Expected ~May 2020
Block 840,000 - 3.125 BTC - Expected ~May 2024
Block 1,050,000 - 1.5625 BTC - Expected ~May 2028
You may notice that the past halvenings have occurred sooner than the expected ~4 year time frame. This is because the network's hashrate has been steadily increasing on average, but the difficulty adjustment only happens every two weeks. This latency means that by the end of the two week difficulty adjustment window, there will be more hashrate pointed at the network, so blocks will be found a little quicker than the 10 minute goal. This effect compounds over time, so each past halvening has occurred a few months ahead of the implied schedule.
Likewise, if the network hashrate were seen to steadily decrease over the next years, we would expect future halvenings to occur at a rate of > 4 years, as blocks would be founds slightly slower than the 10 minute goal.
The estimates given for future halvenings were calculated assuming a ~constant hashrate. A more accurate estimate could perhaps include a range of +/- a few months, based on historical observations of the network's hashrate.