39

On my site, I need to know what timezones people are located in, in order to display messages to them at the right times. I am not too sure what to be searching for in terms of a tutorial on how to do this.

What I am planning on doing is: when a user comes to my site, they will set their timezone by selecting it from a dropdown list. I will store their settings in my database and use it to calculate the times.

I am not sure what I need. What should be my database time be storing? I read somewhere that it should be stored as UTC. How do I set up my database to do this? Also, I will be on a shared hosting site so it has to be set in a way that I can do it (maybe through webconfig?).

Next, I would need a list of all the timezones as either an HTML helper or regular HTML. I really don't want to make one.

Then, like I said, I need a tutorial showing me what to do. I think it is adding and subtracting stuff from that time, but I could be wrong.

alex
  • 6,818
  • 9
  • 52
  • 103
chobo2
  • 83,322
  • 195
  • 530
  • 832

4 Answers4

36

For this purpose, you should definitely be storing your timestamps in UTC in the database.

When you need to display a date from the database on your site, you can do this:

DateTime stamp = /* get datetime from the database here, make sure you
                    use the constructor that allows you to specify the 
                    DateTimeKind as UTC. */

//E.g.
//DateTime stamp = new DateTime(2009, 12, 12, 12, 12, 12, DateTimeKind.Utc);

timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(" /* users time zone here */"); 
var convertedTime = TimeZoneInfo.ConvertTime(stamp, timeZoneInfo);

//Print out the date and time
//Console.WriteLine(convertedTime.ToString("yyyy-MM-dd HH-mm-ss")); 

The list of timezones is already available in .Net, so you can see this post on how to enumerate them. For ASP.Net MVC, instead of printing the time out, you would want to assign the converted datetime to a property of your model class so your View could use it for display.

Community
  • 1
  • 1
womp
  • 115,835
  • 26
  • 236
  • 269
  • Hi Thanks I will start trying to implement this. I have another unknown. Is the user comes to my site and I want to go through the db and see what messages they to display base on their timezone. So would I first figure out what their time is and then convert it to UTC? then do a where with it? So sort of reverse what your doing in your example? – chobo2 Aug 24 '09 at 01:20
  • Well, initially you mentioned allowing the user to set their timezone. However, there are a number of methods of discovering the user's timezone via javascript, you could search around stackoverflow for more info, for example this post: http://stackoverflow.com/questions/1017053/finding-the-clients-timezone-and-culture-via-web-service – womp Aug 24 '09 at 02:39
  • I am fine with them choosing their timezone and don't really want to look into javascript right now. I am just saying would that be how I would start looking for specific dates in my db? By trying to convert back to UTF? – chobo2 Aug 24 '09 at 03:16
  • I was just trying to get your stuff to run and um "Kind" is readOnly. – chobo2 Aug 24 '09 at 06:48
  • Ah, correct you are, forgot about that. You have to specify it when you construct your DateTime object initially. For example, DateTime time = new DateTime(2009, 12, 12, 12, 12, 12, DateTimeKind.Utc);. I'll edit my answer. – womp Aug 24 '09 at 07:05
  • Hey I been thinking do I even need to know their timezone? I am just wonering if I store everything in UTC in my database and they come to my site can't I just go DateTime.Utc and it will give me the utc time? then I just use that to search my dtabase? Or would this give me the Utc time of the server? – chobo2 Aug 25 '09 at 06:02
9

I cannot stress how important it is to use UTC for storage and processing for any application you write. Even if you know the application will ever only be used in a single timezone it is still much easier to work with UTC than a local timezone because of daylight saving time issues.

There's really nothing special you need to do at the database level. Just create a normal datetime column, but make sure it is documented clearly that the column is assumed to be UTC.

I'll be honest, asp.net isn't my expertise, but I'm thinking you could obtain the timezone from the client request somehow. Actually, because the daylight saving time rules can be pretty obscure depending on the region it might be better to use a java script that calculates the UTC offset and use that to make the conversions. Even after the Energy Policy Act of 2005 there are still some exceptions to the DST rules that would rather hard to deal with on the server side. However, I think you're idea of allowing the client to set their own timezone would work well in most cases.

Brian Gideon
  • 47,849
  • 13
  • 107
  • 150
2

First, check MSDN for DateTime documentation and read up on it. Here is an article on Best Practices with DateTime that covers timezones and UTC.

Yes, you should be storing UTC in your database. Storing DateTimes as UTC will allow you to translate times to (and from) users based on their selected timezone. You're on the right track!

jscharf
  • 5,829
  • 3
  • 24
  • 16
1

Usage

getCurrentDateTimeWithTimeZone("Central Europe Standard Time");

Method

public DateTime getCurrentDateTimeWithTimeZone(string strTimeZone)
    {
        var localTimezone = TimeZoneInfo.Local;
        var userTimezone = TimeZoneInfo.FindSystemTimeZoneById(strTimeZone);

        var todayDate = DateTime.Now;
        var todayLocal = new DateTimeOffset(todayDate,
                                            localTimezone.GetUtcOffset(todayDate));

        var todayUserOffset = TimeZoneInfo.ConvertTime(todayLocal, userTimezone);
        return todayUserOffset.DateTime;

    }

List of Timezone ID

Dateline Standard Time

UTC-11

Samoa Standard Time

Hawaiian Standard Time

Alaskan Standard Time

Pacific Standard Time (Mexico)

Pacific Standard Time

US Mountain Standard Time

Mountain Standard Time (Mexico)

Mountain Standard Time

Central America Standard Time

Central Standard Time

Central Standard Time (Mexico)

Canada Central Standard Time

SA Pacific Standard Time

Eastern Standard Time

US Eastern Standard Time

Venezuela Standard Time

Paraguay Standard Time

Atlantic Standard Time

Central Brazilian Standard Time

SA Western Standard Time

Pacific SA Standard Time

Newfoundland Standard Time

E. South America Standard Time

Argentina Standard Time

SA Eastern Standard Time

Greenland Standard Time

Montevideo Standard Time

UTC-02

Mid-Atlantic Standard Time

Azores Standard Time

Cape Verde Standard Time

Morocco Standard Time

UTC

GMT Standard Time

Greenwich Standard Time

W. Europe Standard Time

Central Europe Standard Time

Romance Standard Time

Central European Standard Time

W. Central Africa Standard Time

Namibia Standard Time

Jordan Standard Time

GTB Standard Time

Middle East Standard Time

Egypt Standard Time

Syria Standard Time

South Africa Standard Time

FLE Standard Time

Israel Standard Time

E. Europe Standard Time

Arabic Standard Time

Arab Standard Time

Russian Standard Time

E. Africa Standard Time

Iran Standard Time

Arabian Standard Time

Azerbaijan Standard Time

Mauritius Standard Time

Georgian Standard Time

Caucasus Standard Time

Afghanistan Standard Time

Ekaterinburg Standard Time

Pakistan Standard Time

West Asia Standard Time

India Standard Time

Sri Lanka Standard Time

Nepal Standard Time

Central Asia Standard Time

Bangladesh Standard Time

N. Central Asia Standard Time

Myanmar Standard Time

SE Asia Standard Time

North Asia Standard Time

China Standard Time

North Asia East Standard Time

Singapore Standard Time

W. Australia Standard Time

Taipei Standard Time

Ulaanbaatar Standard Time

Tokyo Standard Time

Korea Standard Time

Yakutsk Standard Time

Cen. Australia Standard Time

AUS Central Standard Time

E. Australia Standard Time

AUS Eastern Standard Time

West Pacific Standard Time

Tasmania Standard Time

Vladivostok Standard Time

Central Pacific Standard Time

New Zealand Standard Time

UTC+12

Fiji Standard Time

Kamchatka Standard Time

Tonga Standard Time

Community
  • 1
  • 1
B M
  • 1,863
  • 1
  • 25
  • 40