How can I manage timezone differences between client and server in Silverlight? - silverlight

I have SL 5 app with a form which has a field for Date.
I set the default date for this field in code like:
MyDate = System.DateTime.Today;
Or
MyDate = System.DateTime.Now.Date;
then submit the data with WCF Ria Service to save the data into database.
Problem is: if time zone on user client computer and Web server are different, the data of date would be saved with different value.
For example, today is Jan-03-2013, when I save the data from the form, in database, the data is saved as something like Jan-02-2013 23:00:00., not Jan-03-2013 00:00:00.
How to fix this problem?

you could try using
MyDate = DateTime.UtcNow
which would return utc time to the server then you can either store all datetimes as utc or manipulate it before saving to the the db (so it would be saved as server's local time)

In addition to timezone differences, there can be also real date value difference between client and server.
For that reason I think you should always get the date from server each time or you should ger the time at the application startup from both the client and server and find the the difference interval. Then you should calculate server datetime by adding the difference to the local date value.
For the timezone differences, also you should alway work in UTC format bu you should show the value to the user as local timezone format of course.

Related

SQL/Navision DateTime Issue

I don't know if anyone else has experiencing this issue before
I have DateTime Data in a MsSQl table but when displaying the same data in Navison 2013, it is displaying the time wrongly.
2018-12-14 08:20:22.000 is being displayed as 14-12-18 11:20:22 AM
Any suggestions ?
Thanks in Advance
The time stored in the SQL database will be stored in UTC. However, since you're based in Kenya (I assume from your profile), your time zone is UTC+3. Navision (Dynamics NAV) automatically converts UTC time into your local time zone.
So if you're writing to the database directly without going through Navision you should use UTC time to save the time.

Is there an equivalent to ConvertTimeFromUtc in MS SQL Server?

Is there a function in SQL Server that will convert a DateTime saved as UTC time to the local time? The problem is that I have times saved as UTC times, and I used to calculate time zone offset as
select #tzoffset = datediff(mi,SYSDATETIMEOFFSET(),SYSDATETIME())
and adding that to my UTC times, which worked fine until daylight saving came.
As that selects the current time zone offset, the calculation is invalid for pre-DST values.
As the dates are rendered in ASP.NET web form, I have worked around the issue by rendering the dates as TimeZoneInfo.ConvertTimeFromUtc((DateTime)Eval("maxtime"), TimeZoneInfo.Local), which works automagically.
Is there something similarly elegant in T-SQL?
It is not that simple. Read this http://blogs.msdn.com/b/bartd/archive/2009/03/31/the-death-of-datetime.aspx

DateTime.Today value changed when sending to the server

I am working with Silverlight and I am getting a problem. In my Database I have stored some dates with a format like this yyyy/mm/dd 00:00:00, which means that I store only the year, month and day, getting the time to 00:00:00.
When the client performs an action and sends to the server I get the DateTime.Today which will keep the format of my database date, but when it is sendind I get yyyy/mm/dd 22:00:00, so when my server side function gets the date, it will return no values from the database.
How can I fix this to get the correct datetime?
Thank you
Use UTC times to make sure you don't run into timezone issues.
You can see if the DateTime is UTC or local based by checking the Kind property, and you can get the current UTC time by DateTime.UtcNow.
DateTime structure is very prone to DST, timezones and cultures when serialising it.
are you serialising it at client side before push it ? what is the difference between client and server timezones ?
I would suggest that you try and consume DateTime.UtcNow and then serialise the data. i prefer to serialise using Invariant culture
HTH
In addition to storing UTC time in the database, you can hard set the time to 12:00:00 for all date values by using the Date property of the DateTime class.
DateTime.UtcNow.Date
You can present the date to the user in their local timezone using the ToLocalTime method:
DateTime.ToLocalTime().Date
I'm sure every database engine has a similar function, but the SQL Server function to get UTC date is (surprisingly enough):
GETUTCDATE()
I hope this helps.

How to deal with DateTime and TimeZone in Silverlight?

I am working on Silverlight Application with SQL Azure. As I know if DateTime Kind is Unspecified, Silverlight will change it to Local and it will save to Azure as UTC time.
Everything working as expect but when I get DateTime data from SQL Azure, its Kind is Unspecified and Silverlight does not convert back to Local time when its display on UI.
For example: I use my application in Rome (UTC +1), I set date to 15:00 then save to database. In database it will save as 14:00 (UTC).
Now I open page to edit that data, it query from database as 14:00 with Unspecified kind and it also show 14:00 in page, which obviously incorrect.
I tried to set DateTime kind at DomainService (before return those data to client) by checking if its kind is unspecified, set it to UTC. This time when I change DateTime on my page its kind is always UTC.
It seems like silverlight will convert date only if its kind is Unspecified, otherwise it do nothing, it also can't convert DateTime from database to display properly even those DateTime has Kind.
I want to know, are there any solutions or work around for this problem?
If you know its stored in UTC, have you tried setting datetime, then using having Silverlight explicitly convert to local time? I am not familiar with Silverlight, but in other forms of .NET, you have to do this conversion explicitly for UI operations.
DateTime dt = GetDateFromDB();
dt = dt.SpecifyKind(DateTimeKind.UTC);
DateTime dtAsLocal = dt.ToLocalTime();

Invariant dates with WCF RIA Services

Is there any way to prevent Silverlight/RIA Services from converting a datetime object on the wire?
Right now, I see datetimes set to 'Local' or 'Unspecified' being converted to the local time of the server when they are sent over the wire.
For example:
The client and server are both in UTC -04:00:00.
I use DateTime.Today (kind is either Local or Unspecified, it doesn't make a difference) on the Silverlight client. I see 23/08/2010 00:00:00.
I submit my changes and watch the data go over the wire. The field is expressed at 23/08/2010 00:00:00 (-04:00:00).
Great. Now I change my client to be in UTC +12:00:00
I use DateTime.Today on the client and now I see 24/08/2010 00:00:00.
HOWEVER - I submit my changes and watch the data again. Now I see 23/08/2010 08:00:00 (-04:00:00).
So it is apparent that the serializer is converting to the local time of the server, which I do not want. The value I want in the DB is 24/08/2010 00:00:00.
Using UTC is not a great option for this field as the database is part of our legacy application and the column contains invariant dates at this time. I don't want to start inserting UTC datetimes alongside the existing data.
Any ideas?
Thanks in advance
If I create the DateTime like this, it works:
new DateTime(DateTime.Now.Ticks, DateTimeKind.Unspecified).Date;

Resources