Convert Date/Time for given Timezone - java Convert Date/Time for given Timezone - java java java

Convert Date/Time for given Timezone - java


For me, the simplest way to do that is:

Calendar calendar = Calendar.getInstance();calendar.setTime(new Date());SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//Here you say to java the initial timezone. This is the secretsdf.setTimeZone(TimeZone.getTimeZone("UTC"));//Will print in UTCSystem.out.println(sdf.format(calendar.getTime()));    //Here you set to your timezonesdf.setTimeZone(TimeZone.getDefault());//Will print on your default TimezoneSystem.out.println(sdf.format(calendar.getTime()));


Understanding how computer time works is very important. With that said I agree that if an API is created to help you process computer time like real time then it should work in such a way that allows you to treat it like real time. For the most part this is the case but there are some major oversights which do need attention.

Anyway I digress!! If you have your UTC offset (better to work in UTC than GMT offsets) you can calculate the time in milliseconds and add that to your timestamp. Note that an SQL Timestamp may vary from a Java timestamp as the way the elapse from the epoch is calculated is not always the same - dependant on database technologies and also operating systems.

I would advise you to use System.currentTimeMillis() as your time stamps as these can be processed more consistently in java without worrying about converting SQL Timestamps to java Date objects etc.

To calculate your offset you can try something like this:

Long gmtTime =1317951113613L; // 2.32pm NZDTLong timezoneAlteredTime = 0L;if (offset != 0L) {    int multiplier = (offset*60)*(60*1000);    timezoneAlteredTime = gmtTime + multiplier;} else {    timezoneAlteredTime = gmtTime;}Calendar calendar = new GregorianCalendar();calendar.setTimeInMillis(timezoneAlteredTime);DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");formatter.setCalendar(calendar);formatter.setTimeZone(TimeZone.getTimeZone(timeZone));String newZealandTime = formatter.format(calendar.getTime());

I hope this is helpful!


As always, I recommend reading this article about date and time in Java so that you understand it.

The basic idea is that 'under the hood' everything is done in UTC milliseconds since the epoch. This means it is easiest if you operate without using time zones at all, with the exception of String formatting for the user.

Therefore I would skip most of the steps you have suggested.

  1. Set the time on an object (Date, Calendar etc).
  2. Set the time zone on a formatter object.
  3. Return a String from the formatter.

Alternatively, you can use Joda time. I have heard it is a much more intuitive datetime API.