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

Git Feature Branch Workflow

Motivator It's important for a team to have an agreement on how the changes of source code should be applied. According to projects and teams size, we will define a workflow or select one from recommended workflows ; the "Feature Branch Workflow" is a candidate. What is it? - One branch "master" for main codebase - Several separated branches for features development Why should we care? - Be super simple and allow each developer works on a particular feature. - A stable codebase (master) benefits for continuous integration (CI) environment - Leverage "Pull request" for Code review How it works? A lifecyle of a feature branch (usually created by a story) 1. Creator creates a new branch from a story.  For example: "ABC-1-setup-projects" 2. Creator checkouts the created branch and works on the branch (commits, pushes) 3. Creator has done the feature, he uses "pull request" to merge his branch into branch "master...

Monday vhandit #2

  Introduction to OpenLDAP directory service "A directory is a specialized database specially designed for searching and browsing, in addition to supporting basic lookup and update functions" A directory service can be local, providing a restricted context; or global, providing service to a much broader context. Curlie is a good example of a directory service. LDAP (Lightweight Directory Access Protocol) is a protocol for accessing directory services , specifically X.500-based directory services. OpenLDAP is an open-source implementation of LDAP. Writing system software: code comments I have read Clean Code (by Uncle Bob) and I thought that I should void comments since the code it explains its implementation itself. That is right but not always true. In this post, the author categorized the comments into 9 types. Only "trivial comments" and "backup comments" are the ones that should be avoided. I myself agree with "writing good comments is harder tha...

Managing JAR files with Apache Maven

Apache Maven (Maven) is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information. Why Maven? Let’s learn about the Maven’s history here https://maven.apache.org/background/history-of-maven.html to understand why Maven is created. There are a lot of useful things that we should use Maven. In my opinion, the most important thing is that Maven solves the problems with managing jar files. It centralizes these files in one place and it is easy to use by declaring dependencies in a xml file (pom.xml).  Using Maven to manage JAR files Firstly, I would like to give you an example about using some JAR files without Maven.  In my project, I need some JAR files such as SNMP4J.jar, jta26.jar, jgraphx.jar, etc… so I had to search them on the Internet with visiting a lot of websites, download and add these files into my proje...

Junit - Test fails on French or German string assertion

In my previous post about building a regex to check a text without special characters but allow German and French . I met a problem that the unit test works fine on my machine using Eclipse, but it was fail when running on Jenkins' build job. Here is my test: @Test public void shouldAllowFrenchAndGermanCharacters(){ String source = "ÄäÖöÜüß áÁàÀâÂéÉèÈêÊîÎçÇ"; assertFalse(SpecialCharactersUtils.isExistSpecialCharater(source)); } Production code: public static boolean isExistNotAllowedCharacters(String source){ Pattern regex = Pattern.compile("^[a-zA-Z_0-9_ÄäÖöÜüß áÁàÀâÂéÉèÈêÊîÎçÇ]*$"); Matcher matcher = regex.matcher(source); return !matcher.matches(); } The result likes the following: Failed tests: SpecialCharactersUtilsTest.shouldAllowFrenchAndGermanCharacters:32 null A guy from stackoverflow.com says: "This is probably due to the default encoding used for your Java source files. The ö in the string literal in the J...

Building Axon.ivy Projects on Bitbucket Pipelines

Read me  if you don't know what Axon.ivy (Ivy) is. Motivation -  Ivy projects are designed to be built on a continuous integration (CI) server like Jenkins - Today, Bitbucket supports for CI with Bitbucket Pipelines - We're using Bitbucket. Then, why not? It must be very cool and convenient for us if we can centralize our CI and VCS (version control system) tools in one place. Here is an approach We have to use a maven plugin called project-build-plugin  to build ivy projects. This plugin requires an instance of Ivy engine during building time. Bitbucket Pipelines allows us to specify our own docker image as a build environment. What we need to do  is to prepare our docker image with needed stuffs such as JDK, Maven, Ivy engine, etc. Step 1. Prepare Docker images For testing purpose, I already created two docker images: Maven and Axon.ivy engine. They are now available on Docker Hub This image for Maven using Oracle JDK 8 This image for Axon.iv...