[NOTE: This answer assumes the computer running the code is in the GMT timezone]
It's because "W. Europe Standard time" isn't the same timezone as UTC according to .Net (even though it should be). This is very odd, and seems like a bug in the .Net libraries.
Due to this, you've inadvertently told it to convert a time to UTC and passed it a UTC (i.e. GMT time) but then told it that the time is in "W. Europe Standard time", which is an hour ahead of UTC.
So naturally, the resulting time in an hour different.
Step by step:
var now = new DateTime(DateTime.Now.Ticks, DateTimeKind.Unspecified);
This sets now
to the time in UTC.
var convertedTime = TimeZoneInfo.ConvertTimeToUtc(now, TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard time")
This converts now
to UTC, assuming that now
is in "W. Europe Standard time", i.e. UTC+1. But it isn't! Therefore the result is incorrect.
[EDIT in response to comments below]
Note that "W. Europe Standard time"
should be UTC, but it isn't for some reason. And when you do this:
TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard time")
it returns UTC+1 rather than the (apparently) correct UTC. It even changes the name to "W. Europe Daylight Time"
. Seems like it might be a curious bug?
[Second Edit]
Check out the Microsoft Time Zone Index Values (and also here). (Note Neither of those links are actually for Windows 7, but they contain the same definitions.)
It has an entry for "W. Europe Standard Time" which definitely states (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna