Skip to main content

How to convert time between timezone in Java, Primefaces?


I use the calendar Primefaces component with timeOnly and timeZone attributes for using only hour format (HH:mm). Like this:
 <p:calendar id="xabsOvertimeTimeFrom" pattern="HH:mm" timeOnly="true" value="#{data.dateFrom}" timeZone="#{data.timeZone}"/>

We can convert the value of #{data.dateFrom} from GMT/UTC time zone to local, conversely, from local time zone to GMT/UTC time zone. Here is my functions:
package vn.nvanhuong.timezoneconverter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;



public class TimeZoneConverter {
 
 /**
  * convert a date with hour format (HH:mm) from local time zone to UTC time zone 
  */
 public static Date convertHourToUTCTimeZone(Date inputDate) throws ParseException {
  if(inputDate == null){
   return null;
  }
  Calendar calendar = Calendar.getInstance();
  calendar.setTime(inputDate);
  int hours = calendar.get(Calendar.HOUR_OF_DAY);
  int minutes = calendar.get(Calendar.MINUTE);
  String dateString = ""+((hours>9)?""+hours:"0"+hours)+":"+((hours>9)?""+minutes:"0"+minutes)+"";
  SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
  sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
  return sdf.parse(dateString);
 }
 
 /**
  * convert a date with hour format (HH:mm) from UTC time zone to local time zone
  */
 public static Date convertHourFromUTCToLocalTimeZone(Date inputDate) throws ParseException {
  if(inputDate == null){
   return null;
  }
  Date localFromGmt = new Date(inputDate.getTime() - TimeZone.getDefault().getOffset(inputDate.getTime()));
  
  Calendar calendar = Calendar.getInstance();
  calendar.setTime(localFromGmt);
  int hours = calendar.get(Calendar.HOUR_OF_DAY);
  int minutes = calendar.get(Calendar.MINUTE);
  String dateString = ""+((hours>9)?""+hours:"0"+hours)+":"+((hours>9)?""+minutes:"0"+minutes)+"";
  SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
  
  return sdf.parse(dateString);
 }
 
}

And Unit test for them:
package vn.nvanhuong.timezoneconverter.test;

import static org.junit.Assert.assertEquals;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

import org.junit.Test;

import vn.nvanhuong.timezoneconverter.TimeZoneConverter;

public class TimeZoneConverterTest {

 @Test
 public void testConvertHourToUTCTimeZoneWhenNull() throws ParseException {
  Date inputDate = null;
  Date expected = null;
  Date actual = TimeZoneConverter.convertHourToUTCTimeZone(inputDate); 
  assertEquals(expected,actual);
 }
 
 @Test
 public void testConvertHourToUTCTimeZoneWhenNotNull() throws ParseException {
  SimpleDateFormat isoFormat = new SimpleDateFormat("HH:mm");
  Date inputDate = isoFormat.parse("19:21");
  isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
  Date expected = isoFormat.parse("19:21");
  Date actual = TimeZoneConverter.convertHourToUTCTimeZone(inputDate); 
  assertEquals(expected,actual);
 }
 
 @Test
 public void testConvertHourToDefaultTimeZoneNull() throws ParseException {
  Date inputDate = null;
  Date expected = null;
  Date actual = TimeZoneConverter.convertHourFromUTCToLocalTimeZone(inputDate); 
  assertEquals(expected,actual);
 }
 
 @Test
 public void testConvertHourToDefaultTimeZoneNotNull() throws ParseException {     
  SimpleDateFormat isoFormat = new SimpleDateFormat("HH:mm");
  Date expected = isoFormat.parse("09:21");
  isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
  Date inputDate = isoFormat.parse("09:21"); //16:21
  Date actual = TimeZoneConverter.convertHourFromUTCToLocalTimeZone(inputDate);
  assertEquals(expected, actual);  
 }

}

Hope that is useful for everyone! ;)

Comments

Popular posts from this blog

BIRT - Fix the size of an image

I use a dynamic image as a logo my report in pdf. At the beginning, I use table to align the logo in left or right. I meet a problem with some images with a large width or height. My customer requires that the logo should be displayed in original size. These following steps solves my problem: 1. Use Grid instead of Table 2. Set Grid "Height" is 100%  and "Width" is blank 3. Set "Fit to container" for images are "true". Download the the template here .

[Snippet] CSS - Child element overlap parent

I searched from somewhere and found that a lot of people says a basic concept for implementing this feature looks like below: HTML code: <div id="parent">  <div id="child">  </div> </div> And, CSS: #parent{   position: relative;   overflow:hidden; } #child{   position: absolute;   top: -1;   right: -1px; } However, I had a lot of grand-parents in my case and the above code didn't work. Therefore, I needed an alternative. I presumed that my app uses Boostrap and AngularJs, maybe some CSS from them affects mine. I didn't know exactly the problem, but I believed when all CSS is loaded into my browser, I could completely handle it. www.tom-collinson.com I tried to create an example to investigated this problem by Fiddle . Accidentally, I just changed: position: parent; to position: static; for one of parents -> the problem is solved. Look at my code: <div class="modal-body dn-placeholder-parent-positi...

Generating PDF/A From HTML in Meteor

My live-chat app was a folk of project Rocket.Chat which was built with Meteor. The app had a feature that administrative users were able to export the conversations into PDF files. And, they wanted to archive these files for a long time. I happened to know that PDF/A documents were good for this purpose. It was really frustrated to find a solution with free libraries. Actually, it took me more than two weeks to find a possible approach. TL, DR; Using Puppeteer to generate a normal PDF and using PDFBox to load and converting the generated PDF into PDF/A compliance. What is PDF/A? Here is a definition from Wikipedia: PDF/A  is an  ISO -standardized version of the  Portable Document Format  (PDF) specialized for use in the  archiving  and long-term  preservation  of  electronic documents . PDF/A differs from PDF by prohibiting features unsuitable for long-term archiving, such as  font  linking (as opposed to  font em...

[Snippet] Generate a new unique "name" string from an existing list

Suppose that we have a list of employees. Everytime, we want to add new employee into this list, the name of the employee will be generated with the following rules: - the name of the new one is set to " [originalname] 1 " - in case the name already exist, " [originalname] 2 " is used, and so on. Here is my code snippet by Javascript: var employees =[ {id: 1, name: 'name'}, {id: 2, name: 'name 1'}, {id: 3, name: 'name 2'}, {id: 5, name: 'name 4'} ]; var commonUtils = { isExistName: function(_name, _collection, _prop) { for(var i = 0; i< _collection.length; i++){ if(_collection[i][_prop].localeCompare(_name)==0){ return true; } } return false; }, generateNewName: function(_name, _collection, _prop){ var i = 1; var searching = true; while (searching) { var newName = _name+ " " + i; if (!this.isExistName(newName, _collection, _pro...

Retrospective with Sailboat

Have you ever got bored with the Retrospective meeting? I have, sometime. Most of the times, this meeting just goes traditionally by answering three questions: "What good things have we done? What bad things have we done? And, what actions should we improve?" Ever and ever again! My team found a way to make it a little bit more exciting. The idea is that each member - not only our Scrum Master - will become a host. If a meeting is hosted by a memeber, the next meeting will be hold by another one. Yeah, I used "Sailboat" pattern in my turn. So, I just want to share with you guys how it was. I started the meeting by telling a short story that I hoped everyone in my team could recall the meaning behind of Retrospective meetings: There is a group of people trying pick up trash in a park. At the first look, the park seem not to have a lot of trash because they are spread out all over the place. However, these people continuously found trash when they sta...