Where does JVM gets the date and Prints it? [duplicate] - java

This question already has answers here:
How can I ensure in Java that the current local time is correct? [duplicate]
(3 answers)
Closed 6 years ago.
I stumbled upon a idea below and wanted to know your opinion:
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
System.out.println(dateFormat.format(date));
If the user's computer is set to a wrong date, does this is print out wrong date.
From where does the JVM captures the date ? How to make sure that Date is always printed correctly even when the end user has adjusted his date?

java relies on the system clock, so if the user has misconfigured their time, timezone, date etc that is what you'll see.
having said that, if your code can assume a working internet connection you could maybe use some java NTP implementation to connect to internet time servers and get the correct time.
see more info here - How to use an Internet time server to get the time?
if you dont require the degree of precision that NTP offers and want something simpler you could hit up any number of rest APIs that serve time - here is one

JVM will capture the date from the System. If you set it incorrect it will give you incorrect timings. Still if you would like to have correct timings, you can use any REST API's which will pick up correct date, time according to your timezone from the internet.
You can get free APIs from TimeZone

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.

How to show a last modified LocalDateTime in Java 8?

I am developing a basic contact address application using Java FX.
I am using LocalDateTime and I have also created a class to format the date and time into a String so I can display it in Label of Java FX.
However, I do not understand how can I display the date and time when I create a new contact or when I edit one that already exists (I have already implemented all the functions I have just described, except the one I am asking right now).
At the moment I have managed only to enter manually a date and a time via GUI, but that is not what I want.
If you need any other relevant information or some snippets of the code to help me faster, just ask and I will edit the post.
If I understood the question correctly, just generate a date in your method that creates or edit the contact.
String currentDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"));
You can also use timezones.
String currentDate = LocalDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"));
Read about java date here: http://www.baeldung.com/java-8-date-time-intro

Google App Engine - GAE will not set Default TimeZone

I have tried the following so I can get Date based on my timezone which is "Africa/Johannesburg" or GMT+2:00 but Google servers always return time using its own timezone which is 2 hours behind mine.
I have done the FF:
in appengine-web.xml I have set
<property name="user.timezone" value="Africa/Johannesburg"/>
I have also tried TimeZone.setDefault(TimeZone.getTimeZone("GMT+2:00")); before creating Date object
in the init method of my servlet, I have also tried
#Override
public void init() throws ServletException {
TimeZone.setDefault(TimeZone.getTimeZone("GMT+2:00"));
}
But this thing won't just work. Because JDK date is not thread safe, I am using JodaTime, which works well, In fact when I do new DateTime(DateTimeZone.forID("Africa/Johannesburg")) I get correct time but for legacy issues, I have to store date in JDK date hence have to convert Joda to JDK Date by invoking .Date(), then the time is completely screwed up in wrong timezone.
Does anyone by chance know how to set this without having to subtract the hours difference.
You can't. The system timezone is not changeable. You should store all of your dates in unix time and convert them to a Date or Calendar object using your timezone. I also would not assume that GAE is always going to use the same timezone...
When you save any date in Datastore it will be saved in the timeZone you have set in your JVM, thats why before starting the app I always set it to UTC:
//To avoid difference of dates depending on where the server is located
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Nonetheless when you browse the datastore in the gcloud console it will be shown in your local timezone (probably it gets the browser timezone and adapts the response to you). But when you query it back the calendar date taken in count will be the one you used for saving it (In my case UTC).

Suspicious JVM Time Behavior

I have totally strange problem on one of my machines. I've written a program which is monitoring events from our servers and displays them on a monitoring pc. However, each event status message also contains a TIMESTAMP which is being retrieved by the following calls:
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
return sdf.format(cal.getTime());
with
public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";
I'm expecting this call to return the local time, which is and was working great until today. But now my program shows me the local time +3 hours on every incoming event. A restart of the jar file does not help at all and the System Time is also set up correctly. This program is running on a machine which is synchronizing its time with an central corporate clock.
Can anyone explain me the mentioned behavior and/or state a possible solution which is not "restart the machine and try again" :-) ?
Cliffs:
- Retrival of Time is working on my- or any other machine when I start the Program
- The target Machine is running 24/7 and is only a monitoring machine, so no one is changing any options there
- It worked fine until today.
- All Time/Timezone settings on the Hostsystem (Windows XP) are correct. (checked via CMD -> "date" and also over the System Preferences)
I appreciate any kind of answer to this issue. Thank you for your time!
the Question is answered since the 25 already. I've implemented a explicit call of Timezone.setDefault() to make sure that the proper timezone is being shown the whole time. I'll close this Question now.
Thank you all for your answers!
This code:
cal.getTime()
Returns a Date object. A Date object is simply a wrapper for the UTC time as a long. In the code you showed us, it is just as correct to do sdf.format(new Date());
What is the format DATE_FORMAT_NOW? I assume you specify this yourself. Do you specify the timezone in this format?
EDIT As you mentioned in your comment, DATE_FORMAT_NOW does not specify a timezone. You should do both Timezone.getDefault() and sdf.getTimezone() to see if the value has changed to your locale + 3 hours.
EDIT2 I found this forum post about the time sporadically changing. In this case it was caused by an Oracle driver calling Timezone.setDefault(...) in the middle of a method, then setting it back afterwards.

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