Time Zone issue with server and html client - java

Basic requirement is Server has data with GMT +00.00 and Browser needs to request data from server between certain dates(not time).
Let's say, one record saved on server on 28th March,2015 Night from USA local time. Server is following GMT +00.00 so record saved with 29th March, 2015 morning with GMT.
Now HTML is retrieving same record from the server. Server have GMT 29th March,2015. But now I want to display local date as per time zone of any browser. Client and server is communication with date only not time.
Right now server will give 29th March, 2015 to client. But It should display as a local date i.e. 28th March, 2015. So how can I manage display date among the different time zone?
Any idea or suggestions will be appreciated.

Well, one solution would be to create a column in your Database with the real timestamp of the date, time included. So, you could show this date (reformated if you want) to client and keep the GMT +00.00 for the process part.
The problem here, if think is that since you don't save the time part, it's impossible to say if it was Day/Night.
The other solution would be to change your actual date to datetime and save it in GMT +00.00 with another column specifying the offset between GMT +00.00 region and the other (here, USA).
Some maths should do.
I can't propose a written solution since you don't specify your server language (unless it's Javascript ?).
By all means, good luck with that ;).

Related

Spring Boot 2 get client timezone [duplicate]

How to get client/request timezone in jsp?
Unfortunately this information is not passed in HTTP headers.
Usually you need cooperating JavaScript to fetch it for you.
Web is full of examples, here is one http://www.coderanch.com/t/486127/JSP/java/Query-timezone
you cannot get timezone, but you can get current time from client side.i.e. through javascript and than post back. On server side, you can convert that time to GMT/UTC. The UTC shows the TimeZone.
If you just need the local timezone in order to display local times to the user, I recommend representing all times in your service in UTC and rendering them in browsers as local times using Moment.js.
My general rule is to handle and store times in UTC everywhere except at the interface with the user, where you convert to/from local time. The advantage of UTC is that you never have to worry about daylight-saving adjustments.
Note that if you want to show the age of something (e.g. "posted 3 hours ago") you just need to compare the UTC timestamp with the current UTC time; no need to convert to local times at all.
Best solution for me is sending date/time as a string, and then parse with server's timezone to get a timestamp. Timestamps are always UTC (or supposed to be) so you will not need client's TimeZone.
For example, sending "10/07/2018 12:45" can be parsed like:
SimpleDateFormat oD = new SimpleDateFormat();
oD.applyPattern("dd/MM/yyyy HH:mm");
oD.setTimeZone(TimeZone.getDefault()); // ;)
Date oDate = oD.parse(request.getParameter("time"));
Obviously you can set your specific date/time format.

EDT or EST? Dynamically set 3 letter timezone based on daylight savings

Given a timezone like 'EDT' in java, is there a way to set an arbitrary datetime in java to be in that timezone and print with the correct label, (either EDT or EST)?
Some context:
I am developing a weekly report generation feature that needs to timestamp reports in the timezone of the user who first configured the report. I would like to label the reports using the 3 letter timezone labels like 'EST' or 'CST,' so that users would see a message like "This report was generated at 03-28-2018 12:00:00 pm EDT." (I realize these can be ambiguous.)
Reports are generated as pdfs on the server so all information must come from the report configuration saved in the database.
Right now when the client posts a new report configuration, it includes the three letter timezone in the configuration along with its offset (eg 'GMT-0400' for EDT), and use that to create a LocalDateTime with the saved offset, then print it with saved label. Obviously this won't account for daylight savings, so I need a better solution.
For reference I am using AngularJS on the client.
It turns out my problem needed a client side solution, based on comments and this question, I used moment.js moment.tz.guess(); to get an IANA timezone which is included when configuring a new report.
Once the server knows the IANA timezone creating the zoned datetime is simple:
String timezone = "America/New_York";
ZonedDateTime timestamp = ZonedDateTime.now().withZoneSameInstant(ZoneId.of(timezone));

WCF DateTimes and Android

There is a nightmare i am leaving these days. And it is the DateTimes in android and the Web services
I have a WCF webservice located in a -5:00 UTC time zone and i develop an app for multi time zones
How can i handle my users datetimes so it appears correct on everyone + there is search feature by a specific datetime in the app
What is the best way to store datetimes in the database so i can handle this problem
*Note: wcf datetime format from json is "Date (1420088400000-0500)"
The datetime in my db is 2015-1-1 03:00:00
where the above format without the "-0500" gives me a 2015-1-1 08:00:00
Thanks in advance
keep the DateTime same all over the place for the application as -5:00 UTC.
But show the user DateTime after using the offset of the local time.
For Example.
I guy sends an message from India at 9 am to a friend in Japan( Japan leads India by 3 hours 30 minutes) so the app will add the Offset for the local time and the guy in Japan will get the text at 12:30 in afternoon, so it will be relevant for both the people with their timezone although they are following GMT which is mutual between them.
Save the timeStamp on your database and use the local time offset before showing it to the user...

How to handle missing PST hour in Java

I have a webapp that is to be deployed on server having Pacific TimeZone setting. My app is capable of handling PST<->PDT date conversions in calculations but i am facing issue handling missing hour/Invalid Time as described below.
Invalid Time – Between 02:00 AM to 03:00 AM on second Sunday in March due to forward auto-adjustment of clock, this time does not exist in Pacific Time Zone.
So whenever date like 10-Mar-2013 02:00:00 is entered system automatically converts it into 10-Mar-2013 03:00:00. I understood this is happening because this time is actually does not exist in Pacific timezone.
But as per requirement server timezone can not be changed (for eg. GMT) and still need to capture above time (10-Mar-2013 02:00:00). Additionally server auto-adjutment clock settings also can not be changed so i have to do application code change to support above.
Thanks in advance for your help.
Adding code for more clarification:
SimpleDateFormat sdf = new SimpleDateFormat("ddMMyy HH:mm:ss");
//sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
Date date = sdf.parse("100313 02:00:00");
Date date1 = sdf.parse("100313 03:00:00");
System.out.println(sdf.format(date));
System.out.println(sdf.format(date1));
Output:
100313 03:00:00
100313 03:00:00
If i uncomment commented line then output:
100313 02:00:00
100313 03:00:00
Regardless of the time zone setting of the computer, you should always be able to get the current UTC time. Java abstracts this from the OS details, so any time the documentation says you are getting a UTC value (such as milliseconds from 1/1/1970 UTC) then it is accurate. There is no such thing as missing or ambiguous time in UTC.
The reason that it is recommended your servers are set to UTC time zone has to do with the way the system bios clock is synchronized with the operating system's clock. Microsoft Windows operating systems keep the bios on local time and adjust it as necessary, while Linux and Macintosh keep the bios permanently on UTC. Because of this, on Windows systems, there is a remote possibility that the clock is read incorrectly if the adjustment didn't work for some reason. More on this issue here.
If your application is converting dates entered to values that only make sense in the computer's local time zone, then you have projected that time zone on to your users. For desktop applications, this is probably correct because the user is running the code on their own computer. For web applications (and other server-side code), this is certainly the wrong thing to do, because it is possible for the client to be in a different time zone than the server.
Please update your question to show the specific code from your application that is causing the problem you described. We can then point you at the specific changes you need to make so your application behaves correctly.

Weird mysql beahviours with timezones? How to control them?

I wrote a webapp using spring+hibernate. I developed everything on windows and then I moved it to a Linux virtual server (Aruba, an Italian provider). I noticed an annoying thing: when dates where saved on windows the time would be the same of my "wall clock", so if I read 13:45 I will have the same hour in the mysql row. This doesn't happen on Linux anyway. In fact the linux machine is on CEST as well (my timezone), I got it typing "date" in the shell. But I get the dates saved in the DB with an offset that is relative to GMT. Again, my app always displays everything in GMT (Including GMT as a time zone if I choose to format the dates to display the time zone) and mysql saves everything in that format. How do I control all this?
I post the solution by myself, because I think it's worth having it in this site.
First of all: mySql doesn't store any timezone information. So say that you are running on GMT+4 and you write a couple of records that contain date fields. Then you move your system in GMT-2 you read those records (perhaps importing the data from mysqldump). If your system and VM have GMT-2 as timezone the dates you read will be taken as if they were written in GMT-2 and NOT ADJUSTED.
Solution: Take control of your VM timezone by using -Duser.timezone="GMT" command line option (you can even put this in your Tomcat startup script) or your preferred timezone (but GMT is better, let me explain why). This way you'll know for sure which timezone your VM is running. This doesn't mean that Java VM will assume that your system time is the one you specified in your user.timezone, it will know the system timezone and adjust dates accordingly. In fact if you are not in GMT, you will see dates in adjusted to GMT and saved to DB accordingly. This way you'll be sure that you are using that as a reference.
The problem is that if you take a date object and you do myDateObject.toString(), you'll get the date adjusted to GMT, with the hour offset. Which is not what you'll probably want.
The solution is to use SimpleDateFormat and do somthing like this when you have to output a date:
SimpleDateFormat dateFormat = new SimpleDateFormat(
"HH:mm dd/MM/yyyy z", Locale.ITALY);
dateFormat.setTimeZone(TimeZone.getTimeZone("Europe/Rome"));
Everything will get converted the right way. You can even go further if you are developing a web app. You can extract the timezone from the HttpRequest and adjust date output accordingly, but I didn't go so far as I'm writing an application that is intended for Italian users only :D (yay).
Hope this will help.

Categories

Resources