Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a generic TimeZoneInfo For Central Europe?

Is there a generic TimeZoneInfo for Central Europe that takes into consideration both CET and CEST into one?

I have an app that is doing the following:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"); 
DateTimeOffset dto = new DateTimeOffset(someDate, tzi.BaseUtcOffset);
var utcDate = dto.ToUniversalTime().DateTime;

The problem is that this is returning the wrong utcDate because the BaseUtcOffset is +1 instead of +2. It appears that CET has DST as well and depending on the time of the year it is +1 or +2.

like image 655
Jonas Stawski Avatar asked Apr 04 '12 21:04

Jonas Stawski


2 Answers

Firstly, I'd like to applaud mgnoonan's answer of using Noda Time :) But if you're feeling less adventurous...

You're already using the right time zone - but you shouldn't be using BaseUtcOffset which is documented not to be about DST:

Gets the time difference between the current time zone's standard time and Coordinated Universal Time (UTC).

It can't possibly take DST into consideration when you're not providing it a DateTime to fetch the offset for :)

Assuming someDate is a DateTime, you could use:

DateTimeOffset dto = new DateTimeOffset(someDate, tzi.GetUtcOffset(someDate));

Or just ConvertTimeToUtc:

var utcDate = TimeZoneInfo.ConvertTimeToUtc(someDate, tzi);

Note that you should work out what you want to do if your local time occurs twice due to a DST transition, or doesn't occur at all.

like image 136
Jon Skeet Avatar answered Sep 27 '22 23:09

Jon Skeet


Maybe Noda Time can help you out?

like image 38
mgnoonan Avatar answered Sep 28 '22 00:09

mgnoonan