Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Migration from local server to Azure: TIMEZONE UTC. How to solve?

I designed my application considering the fact that, according to the specifications, should run on a server located in Italy and clients will be italian people only.

About a month ago, my bos decided to bring it all on Azure.

Everything went smoothly. The only thing that give me some problem is the fact that the time server is UTC.

The solutions are:

A) simple

modify a startup script to the server time ( http://netindonesia.net/blogs/wely/archive/2011/06/26/setting-timezone-in-windows-azure.aspx )

B) more laborious

Change to make any application to use UTC and show the time properly converted to local time.

If i go for the solution A my doubt is that the fact that the server is set up with a different timezone can somehow create conflicts with Azure.

This is true?

like image 417
Marco Staffoli Avatar asked Jun 28 '11 09:06

Marco Staffoli


3 Answers

I have asked to MS support.

This is the response:

Changing the server time on the Azure Virtual Machines using a startup task is not recommended, you should rather use methods like TimeZoneInfo.ConvertTimeFromUTCTime in your code.

So I will not change the server timezone. Waiting for a response from the support I discover that SqlServer 2008 have a DateTimeOffset data type that is perfect!

http://blogs.msdn.com/b/davidrickard/archive/2012/04/07/system-datetime-good-practices-and-common-pitfalls.aspx

like image 74
Marco Staffoli Avatar answered Oct 13 '22 20:10

Marco Staffoli


A couple years ago I have begun designing all of my apps to consequently handle dates using UTC on both client and server and haven't looked back since.

like image 29
Oliver Weichhold Avatar answered Oct 13 '22 20:10

Oliver Weichhold


There are two issues with DateTime.Now and DateTime.Today on a client side and server side. When you pass DateTime object from client to Azure its Kind equals to Local and it contains time zone information. (June 10, 2011, 12:30am -7)

However, when you save it to the database the region information is lost. Subsequently, when reading this field from the database it creates DateTime with a Utc region (June 10, 2011, 12:30am 0)

Eventually, your client reads the datetime incorrectly.

There are several options to resolve this issue on a client side.

1) Convert DateTime to DateTimeOffset in Method parameters as well as in database. This will guarantee that your Local region (ie PST) will be saved in db

2) Use DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified) - this way the kind of DateTime is unspecified and subsequently saved as is in the db.

var timeNow = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);
serviceClient.SaveTime(timeNow);
var dateTime = serviceClient.GetTime();

Be careful to call DateTime.Now on a server side. You better use DateTime.UtcNow. This time shouldn't be used for business data. Ideally, you would need to refactor your code and pass DateTime or DateTimeOffset from the client.

like image 2
Boris Lipschitz Avatar answered Oct 13 '22 20:10

Boris Lipschitz