I’ve found the best way to deal with TZ conversions, is to use UTC as a common fulcrum.
I convert the target TZ to UTC, using my local utility, then use my local TZ utility to convert from UTC to local.
But I write iOS software, so I have very solid local tools at hand. It might be more problematic, on, say, a webserver.
On a related note, I wrote this utility[0], some time ago. It uses the TZ map from the TZ Boundary Builder project[1].