I am working on a web app using .NET MVC 3 and SQL server 2008 (r2).
Anyway, I have a date time object and I want to convert it to user time. It is fairly trivial to convert right now to user time; I have some java script that will get me the users offset from UTC. And I know my date times offset to UTC.
What I realized yesterday, is that my user’s offsets will change, if they live in a pesky area of the world. And that would cause old dates and time to be wrong by some amount of time.
Now I know C# has some utilities to convert into a time zones time, but do they really handle all of the intricacies of daylights savings?
For example. If I have a time, 10-10-2001 8:00:00 how do I get that into pacific time? Or if i have 6-6-2004, how do i get that into pacific time?
Since the dates change for the roll overs, it is pretty complex, and I would like a general solution that does not require maintenance to set up date ranges for time zones.
I know this is a classic problem in CS, but I cannot find something that really answers my question 100%. From what I have seen: C# uses the current year’s daylights savings dates to change every years date times. Which could cause some mistakes.
Thank you so much for the help.
TimeZoneInfodoes, yes1. (It’s part of the .NET framework, not part of C# – C# is just the language you happen to be using.) However, I don’t think that’s what you really want to do.Why are you storing the
DateTimein the server’s time zone anyway? It would be more sensible to store it in UTC, in most cases. Aside from anything else, if your server is in a time zone which observes daylight saving time, you will end up with ambiguity for one hour per year, when the clock goes back. (The same local time occurs twice.)Once you’ve stored it as UTC, you should give it to your Javascript client as UTC too. While you say that you have “some java script that will get me the users offset from UTC” – that will depend on the exact instant in time. For example, as I’m in the UK, my offset is sometimes 0 and sometimes +1 hour. If you pass the UTC back to the client, that can work out the local time from that UTC time. Your server can’t, unless you can get an accurate representation of the time zone from the client to the server, which is generally a tricky thing to do.
Again, C# itself isn’t relevant here. It’s not clear which part of the .NET framework you mean –
TimeZone?TimeZoneInfo?DateTime?TimeZoneInfohas historical data, but only if you’re on an operating system version which supports it.1 Well, as far as you’re likely to care. It doesn’t have as much historical data as TZDB, and it has some very odd representations for Russia and Namibia, but it does generally have the idea of rules changing.