Cause one: the site timezone is a fixed offset
Go to Settings → General and look at the Timezone field. If it says UTC+1 rather than a city name, that is almost certainly your problem.
A fixed offset does not know your country changes its clocks. It is UTC+1 in January and it is still UTC+1 in July, when your actual local time is UTC+2. Every event is right for half the year and an hour out for the other half, and it flips on the two weekends when nobody is looking for a cause.
Set it to a named city — Europe/Copenhagen, America/New_York — and the clock changes are handled by the timezone database, which is updated by people whose job it is. This one setting is the single most common cause of wrong event times on WordPress sites.
Cause two: the server disagrees with WordPress
PHP has its own timezone setting, and it is frequently UTC regardless of what WordPress thinks. Code that uses PHP's date functions directly, rather than WordPress's, gets the server's answer instead of the site's. That is how one page can show 19:00 and another 17:00 for the same event.
If different parts of your site disagree with each other, this is the cause, and it is a plugin or theme bug rather than a setting you can change.
Cause three: the event has no timezone of its own
If an event was imported from a feed, it may have arrived with no timezone attached at all — what the calendar format calls a floating time. Every reader then interprets it in whatever zone it prefers. If your times were correct before an import and wrong after, this is why. The .ics reader flags these explicitly.
Cause four: it is right, and the visitor is elsewhere
Some calendars convert times into the visitor's own timezone. For an online webinar that is helpful. For a physical venue it is actively harmful: a concert at 8pm is at 8pm at the venue, and showing 2pm to somebody browsing from Chicago is wrong in the only way that matters.
Check whether your calendar is doing this before assuming the stored time is broken. The rule for anything with an address is: display the time at the venue, label it with the zone, and leave the conversion to the reader.
The check that settles it
Put the event's date, time and zone into the tool above. It shows the true instant, the offset on either side, and what it looks like from another country. If that matches what you intended and the website disagrees, the problem is in the display; if it does not match, the problem is in the data.