Mandar Jogalekar
Mandar Jogalekar

Reputation: 3281

Get Datetime Offset for Timezone

I have a code where I need to find current offset from UTC for Central European Timezone.

My code is deployed in azure app service.

var offset = DateTimeOffset.Now.Offset.Hours + ":" + 
             DateTimeOffset.Now.Offset.Minutes;

The problem with above code is, it relies on server time, Even though my App Service is in West Europe, the time zone of Azure App Service is always UTC .

One solution is to change Azure App Service TimeZone to Desired TimeZone and it will work, but i am also looking at getting the offset using code.

Remember I cannot use system datetime to get offset as it's always UTC.

Can I get Current Central Europe DatetimeOffset irrespective of system date time?

Upvotes: 2

Views: 10544

Answers (3)

SZL
SZL

Reputation: 855

With correct daylight saving offsets (example in CET):

        DateTime utcDT = DateTime.UtcNow;
        DateTime cetDT = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(utcDT, "UTC", "Central European Standard Time");

        DateTimeOffset utcDTO = new DateTimeOffset(utcDT);
        DateTimeOffset cetDTO = new DateTimeOffset(cetDT, cetDT - utcDT);

        // Result (with daylight saving)
        //
        // 2021. 06. 24. 7:42:09
        // 2021. 06. 24. 9:42:09
        // 2021. 06. 24. 7:42:09 +00:00
        // 2021. 06. 24. 9:42:09 +02:00

Upvotes: 1

Gareth
Gareth

Reputation: 911

You can do something like this

TimeZoneInfo cet = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");

DateTimeOffset offset = TimeZoneInfo.ConvertTime(DateTime.Now, cet);

As described here.

If you're not sure about a TimeZoneId you can use GetSystemTimeZones() to find it.

An alternative, as described here, would be to do something like this

DateTime nowCet = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now, 
    "Central European Standard Time");

The nice thing about this is you can easily calculate the difference between two time zones like, for example

DateTime newYork = new DateTime(2017, 10, 04, 12, 23, 00);
DateTime berlin = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(newYork, 
    "Eastern Standard Time", "Central European Standard Time");

TimeSpan diff = berlin - newYork;

Upvotes: 5

Sefe
Sefe

Reputation: 14007

You can use TimeZoneInfo:

TimeZoneInfo cetInfo = TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard Time");
DateTimeOffset cetTime = TimeZoneInfo.ConvertTime(DateTimeOffset.Now, cetInfo);

Upvotes: 1

Related Questions